Python實作urllib3和requests庫使用 | python爬蟲實戰之五
HTML解析
通過上面的庫, 都可以拿到HTML内容。
HTML的内容傳回給浏覽器, 浏覽器就會解析它, 并對它渲染。
HTML超文本表示語言, 設計的初衷就是為了超越普通文本, 讓文本表現力更強。
XML擴充标記語言, 不是為了代替HTML, 而是覺得HTML的設計中包含了過多的格式, 承擔了一部分資料之外的任務, 是以才設計了XML隻用來描述資料。
HTML和XML都有結構, 使用标記形成樹型的嵌套結構。DOM(Document Object Model) 來解析這種嵌套樹型結構, 浏覽器往往都提供了對DOM操作的API, 可以用面向對象的方式來操作DOM。
XPath
https://www.w3school.com.cn/xpath/index.asp中文教程
XPath是一門在XML文檔中查找資訊的語言。XPath可用來在XML文檔中對元素和屬性進行周遊。
XPath 術語
在 XPath 中,有七種類型的節點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔(根)節點。XML 文檔是被作為節點樹來對待的。樹的根被稱為文檔節點或者根節點。
節點關系
父(Parent):每個元素以及屬性都有一個父。
子(Children):元素節點可有零個、一個或多個子。
同胞(Sibling):擁有相同的父的節點。
先輩(Ancestor):某節點的父、父的父,等等。
後代(Descendant):某個節點的子,子的子,等等。
XPath 使用路徑表達式來選取 XML 文檔中的節點或節點集。節點是通過沿着路徑 (path) 或者步 (steps) 來選取的。
工具
XMLQuire win7+需要.NET架構4.0-4.5。
測試XML、XPath

使用工具去測試XML、XPath。
在XPath中, 有七種類型的節點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔(根)節點。
/根結點
元素節點
Corets, Eva元素節點,
id=”bk 104”是屬性節點, id是元素節點book的屬性
節點之間的嵌套形成父子(parent、children) 關系。
具有同一個父節點的不同節點是兄弟(sibling) 關系。
謂語(Predicates)
謂語用來查找某個特定的節點或者包含某個指定的值的節點。
謂語被嵌在方括号中。
謂語就是查詢的條件。
XPath軸(Axes)
XPATH執行個體
以斜杠開始的稱為絕對路徑,表示從根開始。
不以斜杆開始的稱為相對路徑,一般都是依照目前節點來計算。目前節點在上下文環境中,目前節點很可能已經不是根節點了。
一般為了友善, 往往xml如果層次很深, 都會使用//來查找節點。
我們需要對上面這些XPATH執行個體熟練練習。
lxml
Ixml是Python下功能豐富的XML、HTML解析庫, 性能非常好, 是對libxml2和libxslt的封裝。最新版支援Python 2.6+, python 3支援到3.6。
官方網站:
https://lxml.de/index.htmlCentOS編譯安裝需要
#yum install libxml2-devel libxslt-devel
注意,不同平台不一樣,參看
http://lxml.de/installation.htmllxml安裝
$pip install lxml
那麼如何來建構一個HTML呢?
from lxml import etree
root = etree.Element('html')
body = etree.Element('body')
root.append(body)
div1 = etree.SubElement(body, 'div')
div2 = etree.SubElement(body, 'div')
print(etree.tostring(root))
執行結果:
進行一個pretty_print列印
print(etree.tostring(root, pretty_print = True).decode())
etree還提供了2個有用的函數
etree.HTML(text) 解析HTML文檔, 傳回根節點
anode.xpath('xpath路徑') 對節點使用xpath文法
從豆瓣電影中提取”本周口碑榜”
我們可以下載下傳插件ChroPath,然後去”本周口碑榜”檢查,通過路徑查找擷取具體内容。當然我們也可以爬蟲實作:
from lxml import etree
import requests
urls = ['https://movie.douban.com/']
session = request.session()
with session:
for url in urls:
response = session.get(url, headers = {
'User-agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"
})
content = response.text
# print(content)
# XPath //div[@class='billboard-bd']//tr//td/a/text()
html = etree.HTML(content)
titles = html.xpath("//div[@class='billboard-bd']//tr//td/a/text()")
for t in titles:
print(t)
此時,想要擷取到标簽以及内容,我們需要修改代碼:
titles = html.xpath("//div[@class='billboard-bd']//tr//text()")
print('-'*30)
當然我們也有另外的方式,修改代碼:
titles = html.xpath("//div[@class='billboard-bd']//tr")
for title in titles:
txt = title.xpath('.//text()')
print(''.join(map(lambda x: x.strip(), txt)))
print('-'*30)
我們對于XPath的處理不要過于複雜,定位到我們需要的内容,然後之後的處理可以通過Python來進行。
配套視訊課程,點選這裡檢視
擷取更多資源請訂閱
Python學習站