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.html
CentOS編譯安裝需要
#yum install libxml2-devel libxslt-devel
注意,不同平臺不一樣,參看http://lxml.de/installation.html
lxml安裝
$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學習站