XPath 是一門在 XML 文檔中查找信息的語(yǔ)言。XPath 可用來(lái)在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷。XPath 是 W3C XSLT 標(biāo)準(zhǔn)的主要元素,并且 XQuery 和 XPointer 都構(gòu)建于 XPath 表達(dá)之上。
XPath 使用路徑表達(dá)式在 XML 文檔中選取節(jié)點(diǎn)。節(jié)點(diǎn)是通過(guò)沿著路徑或者 step 來(lái)選取的。用 XPath 解析網(wǎng)頁(yè)的內(nèi)容,就是確定所取內(nèi)容的路徑,即從大范圍縮小到具體的位置。
| 表達(dá)式 | 描述 |
|---|---|
| nodename | 選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn) |
| / | 從根節(jié)點(diǎn)選取。 |
| // | 從匹配選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn),而不考慮它們的位置。(相對(duì)路徑) |
| . | 選取當(dāng)前節(jié)點(diǎn)。 |
| .. | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)。 |
| @ | 選取屬性。 |
text() 提取文本內(nèi)容
@xxx 提取屬性內(nèi)容
找到XPath兩種方法,一種是手動(dòng)分析,需要對(duì)HTML結(jié)構(gòu)熟悉,了解標(biāo)簽嵌套層級(jí);另一種是Chrome 工具copy,同時(shí)要結(jié)合網(wǎng)頁(yè)標(biāo)簽的進(jìn)行校驗(yàn)。
還是以糗事百科段子笑話為例 http://www.qiushibaike.com/text/

拷貝出來(lái)的XPath內(nèi)容如下:
//*[@id="qiushi_tag_118963704"]/a/div/span/text()
注意,這里[@id="qiushi_tag_118963704"] 指的是div class="article block untagged mb15" ,是唯一的。如果想取出所有的位置的段子內(nèi)容,就不能做唯一限定。修改為:
//div[@class="article block untagged mb15"]/a/div/span/text()
網(wǎng)頁(yè)標(biāo)簽id是唯一的,class標(biāo)簽是同一類標(biāo)簽的樣式。使用標(biāo)簽屬性,方便我們?nèi)〕鐾活愋偷膬?nèi)容。
# coding=utf-8
import requests
from lxml import etree
html = requests.get('http://www.qiushibaike.com/text/').content
selector = etree.HTML(html)
content = selector.xpath('//div[@class="article block untagged mb15"]/a/div/span/text()')
for each in content:
print each
PS 參見(jiàn)之前文章: 爬蟲搜索神器BeautifulSoup和XPath 的使用