python爬去網(wǎng)頁(yè)數(shù)據(jù)時(shí)紫谷,如果使用requests庫(kù)和xpath齐饮,首先需要使用lxml的etree將獲取的網(wǎng)頁(yè)數(shù)據(jù)完整捐寥,因?yàn)橛袝r(shí)候使用requests.get(url ,headers=headers)獲取到的數(shù)據(jù)不完整。etree模塊就可以自動(dòng)修復(fù)html文本祖驱。
安裝lxml:
lxml是python的一個(gè)解析庫(kù)握恳,支持html和xml的解析,同時(shí)也支持xpath解析方式捺僻。
pip install lxml
etree模塊的使用
from lxml import etree
對(duì)網(wǎng)頁(yè)HTML的解析乡洼,使用etree.HTML(html.content)
接下來就可以使用xpath抓取對(duì)應(yīng)的需求節(jié)點(diǎn)的信息了。
xpath的語法
選取節(jié)點(diǎn):
/: 表示選取直接子節(jié)點(diǎn)
<html><body><div></div></body></html>
xpath: /div
result: null
season: /div表示獲取根節(jié)點(diǎn)下的div但是匕坯,根節(jié)點(diǎn)下只有<html> 這一個(gè)子節(jié)點(diǎn)束昵,/是不能獲取到子孫節(jié)點(diǎn)的
//: 表示獲取任意節(jié)點(diǎn)
謂語:
通過列子來說明
//book/div[1]
explanation: 獲取book節(jié)點(diǎn)下的第一個(gè)div節(jié)點(diǎn)
注意: xpath語法的下標(biāo)是從數(shù)字1開始的,這里和python的語法是有區(qū)別的
//book/div[last()]
explanation: 獲取book節(jié)點(diǎn)的最后一個(gè)div節(jié)點(diǎn)
//book/div[positon()<3]
explanation: 獲取book節(jié)點(diǎn)下的前兩個(gè)div節(jié)點(diǎn)
//book/div[@price=1]
explanation: 獲取book節(jié)點(diǎn)下屬性price=1 的div節(jié)點(diǎn)
//book/div[contains(@class,"f")]
explanation: 獲取book節(jié)點(diǎn)下class屬性中包含f的div節(jié)點(diǎn)
通配符:
: 表示獲取任意的節(jié)點(diǎn)
@:表示任意屬性
多個(gè)路徑:
| : //book[@price=1] | //book[@price=2] 表示獲取屬性price=1或者price=2的book節(jié)點(diǎn)
邏輯運(yùn)算符:
< ,> , <= ,>= , !=, and , or