天天看點

python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

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

python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

使用工具去測試XML、XPath。

python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

在XPath中, 有七種類型的節點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔(根)節點。

/根結點

元素節點

Corets, Eva元素節點,

id=”bk 104”是屬性節點, id是元素節點book的屬性

節點之間的嵌套形成父子(parent、children) 關系。

具有同一個父節點的不同節點是兄弟(sibling) 關系。

謂語(Predicates)

謂語用來查找某個特定的節點或者包含某個指定的值的節點。

謂語被嵌在方括号中。

謂語就是查詢的條件。

python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

XPath軸(Axes)

python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

XPATH執行個體

以斜杠開始的稱為絕對路徑,表示從根開始。

不以斜杆開始的稱為相對路徑,一般都是依照目前節點來計算。目前節點在上下文環境中,目前節點很可能已經不是根節點了。

一般為了友善, 往往xml如果層次很深, 都會使用//來查找節點。

python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

我們需要對上面這些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呢?

python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六
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))           

執行結果:

python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

進行一個pretty_print列印

print(etree.tostring(root, pretty_print = True).decode())           
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

etree還提供了2個有用的函數

etree.HTML(text) 解析HTML文檔, 傳回根節點

anode.xpath('xpath路徑') 對節點使用xpath文法

從豆瓣電影中提取”本周口碑榜”

python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

我們可以下載下傳插件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)           
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

此時,想要擷取到标簽以及内容,我們需要修改代碼:

titles = html.xpath("//div[@class='billboard-bd']//tr//text()")

            print('-'*30)           
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

當然我們也有另外的方式,修改代碼:

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)           
python爬蟲實戰實作XPath和lxml | python爬蟲實戰之六

我們對于XPath的處理不要過于複雜,定位到我們需要的内容,然後之後的處理可以通過Python來進行。

配套視訊課程,點選這裡檢視

擷取更多資源請訂閱

Python學習站

繼續閱讀