在Python簡單網絡爬蟲實戰—下載論文名稱,作者信息(上)中,學會了get到網頁內容以及在谷歌瀏覽器找到了需要提取的內容的數據結構,接下來記錄我是如何找到所有author和title的
1.從soup中get到data類
soup中提供了select方法來篩選所需的類。該方法使用方法如下:
articlename = soup.select('title')
該語句即將soup中所有的title元素放到articlename中。select也有其他用法
articlename = soup.select('.data') #類前面要加"." articlename = soup.select('#username')#ID這種唯一的元素,前加"#" articlename = soup.select('.publ-list .entry.editor .data')#可以組合查找,publ-list類下面的entry.editor類下面的data類,按次序用空格隔開 articlename = soup.select('.publ-list .entry.editor .data .title')[0].contents[0]#title類中第一個元素的第一個文本內容
我們用如下語句get到該網頁中所有的data類,這樣就包含了所有的author和title,去除了網頁中其他無關的元素,離目標更近了一步
soup.select('.publ-list .entry.inproceedings .data')
2.data類中篩選所有author與title
這是一個data類的所有內容。
其中author元素還有更下一級的結構
可以看到,一個data類中author和title元素並不是緊密連接的,在每個authro行之間,有“,”和“:”行隔開,在title行下方,還有dataPublished、genre等元素,但下方的元素都是固定的,行數也固定。因此我把一個.data描述為如下的多維數組:
[ [author1,url,name ] ["," ] [author2,url,name ] [":" ] [<br> ] [title,name ] ["datePublished",content] [</article> ] ]
由於作者數量不固定,因此還要計算作者數量。因為每個author元素后面都會跟一個標點符號,因此似乎只要計算data類的長度減去4,再除以2就可以得到作者數量,然而在實際操作中發現,應該減去5。直到現在我也沒有明白原因,可能這里需要補充HTML網站相關的知識。
authornum = int((len(articles)-5)/2)
得到了作者數量,就很容易定位到作者所在的行(下標)和title所在的行(下標)
觀察元素內容可以看到,authorname和titlename都是唯一的文本,用以下命令獲取即可
for i in range(0,authornum): authorlist.append(str(articles.contents[i*2].get_text())) articlename = str(articles.contents[(authornum+1)*2].get_text())
至此,該腳本的所有難點都搞定啦,接下來就水到渠成,理一下邏輯就ok啦