大數據

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

image.png
image.png
image.png

使用工具去測試XML、XPath。

image.png
image.png

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

/根結點
元素節點
Corets, Eva元素節點,
id=”bk 104”是屬性節點, id是元素節點book的屬性

節點之間的嵌套形成父子(parent、children) 關係
具有同一個父節點的不同節點是兄弟(sibling) 關係
謂語(Predicates)
謂語用來查找某個特定的節點或者包含某個指定的值的節點。
謂語被嵌在方括號中。
謂語就是查詢的條件。

image.png

XPath軸(Axes)

image.png

XPATH實例

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

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

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

image.png
image.png
image.png
image.png
image.png

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

image.png

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))

執行結果:

image.png

進行一個pretty_print打印

print(etree.tostring(root, pretty_print = True).decode())

image.png

etree還提供了2個有用的函數
etree.HTML(text) 解析HTML文檔, 返回根節點
anode.xpath('xpath路徑') 對節點使用xpath語法

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

image.png

我們可以下載插件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)

執行結果:

image.png

此時,想要獲取到標籤以及內容,我們需要修改代碼:

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

            print('-'*30)

執行結果:

image.png

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

        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)

執行結果:

image.png

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

配套視頻課程,點擊這裡查看

獲取更多資源請訂閱Python學習站

Leave a Reply

Your email address will not be published. Required fields are marked *