009 - 使用XPath解析網頁

XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。XPath 是 W3C XSLT 標準的主要元素,并且 XQuery 和 XPointer 都構建于 XPath 表達之上。

XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿著路徑或者 step 來選取的。用 XPath 解析網頁的內容,就是確定所取內容的路徑,即從大范圍縮小到具體的位置。

表達式 描述
nodename 選取此節點的所有子節點
/ 從根節點選取。
// 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。(相對路徑)
. 選取當前節點。
.. 選取當前節點的父節點。
@ 選取屬性。

text() 提取文本內容
@xxx 提取屬性內容

找到XPath兩種方法,一種是手動分析,需要對HTML結構熟悉,了解標簽嵌套層級;另一種是Chrome 工具copy,同時要結合網頁標簽的進行校驗。

還是以糗事百科段子笑話為例 http://www.qiushibaike.com/text/

拷貝出來的XPath內容如下:

//*[@id="qiushi_tag_118963704"]/a/div/span/text()

注意,這里[@id="qiushi_tag_118963704"] 指的是div class="article block untagged mb15" ,是唯一的。如果想取出所有的位置的段子內容,就不能做唯一限定。修改為:

//div[@class="article block untagged mb15"]/a/div/span/text()

網頁標簽id是唯一的,class標簽是同一類標簽的樣式。使用標簽屬性,方便我們取出同一類型的內容。

# 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 參見之前文章: 爬蟲搜索神器BeautifulSoup和XPath 的使用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容