1. 程式人生 > >Python使用xpath爬取資料返回空列表解決方案積累

Python使用xpath爬取資料返回空列表解決方案積累

筆者以爬取2018年AAAI人工智慧頂會論文元資料為例。其中包括標題(title)和摘要(abstract)等欄位

前言:

首先需要檢視該網頁是否可以爬取,通過在URL後加入/robots,txt可以檢視。

tbody問題

URL:2018AAAI的第一篇論文元資料頁面 頁面如下:
2323

筆者通過谷歌瀏覽器選取上圖紅框內容的xpath如下:

from lxml import etree
import requests
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/rt/metadata/16583/0/'
response =
requests.get(url) html = response.content data = etree.HTML(html).xpath('//*[@id="content"]/table/tbody/tr[4]/td[4]/text()') print(data)

返回結果是一個空列表
2323434
經查詢得知原因是:瀏覽器會對html文字進行一定的規範化,所以會自動在路徑中加入tbody,導致讀取失敗,在此處直接在路徑中去除tbody即可。
正確xpath:

data = etree.HTML(html).xpath('//*[@id="content"]/table/tr[4]/td[4]/text()')

②URL問題

URL:2018AAAI的第一篇論文頁面
675
筆者通過谷歌瀏覽器選取上圖紅框內容的xpath如下:

from lxml import etree
import requests
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16065'
response = requests.get(url)
xml = response.content
data = etree.HTML(xml).xpath('//*[@id="abstract"]/div/text()')

返回結果是一個空列表
1.首先檢視是否成功獲取了XML


可見成功獲取了xml,說明請求伺服器成功獲得響應。但仔細檢視獲取的xml發現裡面沒有相關的摘要和作者相關資訊。肯定也就無法通過xpath獲取摘要文字。逐步檢視xml發現裡面有一條URL和請求的URL很相似,點進去發現兩個URL是同一個頁面。
在這裡插入圖片描述
發現第二個URL路徑中多了一個Paper欄位。

'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16065'
'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/viewPaper/16065'

嘗試請求第二個URL後發現返回了完整的包含網頁摘要、作者標題等資訊的XML,遂成功爬取到該網頁的摘要。
62

補充:

①建議使用requests.content

建議獲取請求得到的響應用requests.content返回二進位制響應內容,使用requests.text可能會出現編碼宣告不支援問題

xml = response.content

11

②建議加入請求頭(headers)

以模擬瀏覽器登入

from lxml import etree
import requests
headers = {
    'Cookie':'OCSSID=4df0bjva6j7ejussu8al3eqo03',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
                 ' (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/rt/metadata/16583/0/'
response = requests.get(url,headers=headers)
html = response.content
data = etree.HTML(html).xpath('//*[@id="content"]/table/tbody/tr[4]/td[4]/text()')
print(data)

獲取請求頭,使用谷歌瀏覽器可獲取,一般選取User-AgentCookie等欄位,使用瀏覽器登入某個網頁時,需要向伺服器端發出請求,請求頭就包含自己使用的瀏覽器的相關資訊。相關介紹見:百度百科

61