Python爬蟲之xpath的基本使用(解析HTML詳細介紹)

1.XPath介紹

XPath,全稱 XML Path Language,即 XML 路徑語言,它是一門在 XML 文檔中查找信息的語言。最初是用來搜尋 XML 文檔的,但同樣適用於 HTML 文檔的搜索。所以在做爬蟲時完全可以使用 XPath 做相應的信息抽取。

2. XPath 概覽

XPath 的選擇功能十分強大,它提供了非常簡潔明瞭的路徑選擇表達式。另外,它還提供了超過 100 個內建函數,用於字符串、數值、時間的匹配以及節點、序列的處理等,幾乎所有想要定位的節點都可以用 XPath 來選擇。
    官方幫助文檔:https://www.w3.org/TR/xpath/

3. XPath 常用規則

在這裏插入圖片描述
具體匹配後面會詳細的講解。

4. 安裝

1、python3環境下安裝命令:pip install lxml
在這裏插入圖片描述
2.pycharm安裝
Python安裝插件/pycharm安裝插件的方法

5.實例學習

5.1.常用數據的導入

5.1.1打開html文件導入

from lxml import etree

html = etree.parse('./test.html', etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))

5.1.2通過字符串轉換成html格式

用lxml解析html
利用etree.HTML解析字符串
將字符串解析從html格式的文件, 經過處理後,部分缺失的節點可以自動修復,並且還自動添加了 body、html 節點。
Python源碼:

# -*- coding: utf-8 -*-
# 作者: 廢人一枚
# 出自:  北京
# 創建時間: 10:11
import os, traceback

from lxml import etree

text = '''
<p>
    <ul>
        <li class="item-0"><a href="https://s1.bdstatic.com/">item 0 </a></li>
        <li class="item-1"><a href="https://s2.bdstatic.com/">item 1 </a></li>
        <li class="item-2"><a href="https://s3.bdstatic.com/">item 2 </a></li>
        <li class="item-3"><a href="https://s4.bdstatic.com/">item 3 </a></li>
        <li class="item-4"><a href="https://s5.bdstatic.com/">item 4 </a></li>
        <li class="item-5"><a href="https://s6.bdstatic.com/">item 5 </a></li>
    </ul>     
</p>
'''
# 利用 etree.HTML 把字符串解析成 HTML 文件
html = etree.HTML(text)
#decode() 方法將其轉化爲 str 類型
s = etree.tostring(html).decode()
print(s)

輸出爲:
在這裏插入圖片描述

5.2 絕對路徑查找

  • 獲取某個標籤的內容
    注意,獲取a標籤的所有內容,a後面就不用再加正斜槓,否則報錯。
html_data = html.xpath('/html/body/ul/li/a')
for i in html_data:
    print(i.text)

或者

html_data = html.xpath('/html/body/ul/li/a/text()')
for i in html_data:
    print(i.text)

在這裏插入圖片描述

  • 打印指定路徑下a標籤的屬性
    這裏可以通過遍歷拿到某個屬性的值,查找標籤的內容,通過@屬性名獲取
html = etree.HTML(text)
html_data = html.xpath('/html/body/ul/li/a/@href')
for i in html_data:
    print(i)

在這裏插入圖片描述

  • 獲取指定標籤對應屬性值的內容
    使用xpath拿到得都是一個個的ElementTree對象,如果需要查找內容的話,還需要遍歷拿到數據的列表。
    查到絕對路徑下a標籤屬性等於https://s4.bdstatic.com/的內容。
html = etree.HTML(text)
html_data = html.xpath('/html/body/ul/li/a[@href="https://s4.bdstatic.com/"]/text()')
for i in html_data:
    print(i)

在這裏插入圖片描述

5.3 相對路徑查找(常用)

  • 查找所有li標籤下的a標籤內容
html = etree.HTML(text)
html_data = html.xpath('//li/a/text()')
print(html_data)

在這裏插入圖片描述

  • 查找一下l相對路徑下li標籤下的a標籤下的href屬性的值,注意,a標籤後面需要雙//
html = etree.HTML(text)
html_data = html.xpath('//li/a//@href')
print(html_data)

在這裏插入圖片描述

  • 查找a標籤下屬性href值爲https://s4.bdstatic.com/的內容
html = etree.HTML(text)
html_data = html.xpath('//li/a[@href="https://s4.bdstatic.com/"]/text()')
print(html_data)

在這裏插入圖片描述

5.4 子節點

通過 / 或 // 即可查找元素的子節點或子孫節點。
 選擇 li 節點的所有直接 a 子節點xpath爲://li/a

5.5 父節點

知道子節點,查詢父節點可以用 來實現:
    查找a節點屬性爲https://s6.bdstatic.com/的父節點class的屬性xpath爲: //a[@href="https://s6.bdstatic.com/"]/../@class

html_data = html.xpath('//a[@href="https://s6.bdstatic.com/"]/../@class')
print(html_data)

#輸出爲:['item-5']

5.6 屬性匹配

匹配時可以用@符號進行屬性過濾

例如匹配li下屬性class爲item-5的內容

//li[@class="item-5"]

5.7 文本獲取

有兩種方法:一是獲取文本所在節點後直接獲取文本,二是使用 //。
第二種方法會獲取到補全代碼時換行產生的特殊字符,推薦使用第一種方法,可以保證獲取的結果是整潔的。

# 第一種
from lxml import etree

html_data = html.xpath('//li[@class="item-1"]/a/text()')
print(html_data)
# 第二種
html_data = html.xpath('//li[@class="item-1"]//text()')
print(html_data)

5.8 屬性獲取

@符號相當於過濾器,可以直接獲取節點的屬性值

result = html.xpath('//li/a/@href')
print(result)
# 運行結果:['https://s1.bdstatic.com/', 'https://s2.bdstatic.com/', 'https://s3.bdstatic.com/', 'https://s4.bdstatic.com/', 'https://s5.bdstatic.com/', 'https://s6.bdstatic.com/']

5.9 屬性多值匹配

某些節點的某個屬性可能有多個值:

from lxml import etree

text = '''
<li class="zxc  asd  wer"><a href="https://s2.bdstatic.com/">1 item</a></li>
<li class="ddd  asd  eee"><a href="https://s3.bdstatic.com/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "asd")]/a/text()')
print(result)

# 運行結果:['1 item', '2 item']

5.10 多屬性匹配

當前節點有多個屬性時,需要同時進行匹配:

from lxml import etree

text = '''
<li class="zxc  asd  wer" name="222"><a href="https://s2.bdstatic.com/">1 item</a></li>
<li class="ddd  zxc  eee" name="111"><a href="https://s3.bdstatic.com/">2 item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "zxc") and @name="111"]/a/text()')
print(result)

# 運行結果:['2 item']

5.11 函數

  • 查找最後一個li標籤裏的a標籤的href屬性(last()函數
html = etree.HTML(text)
html_data = html.xpath('//li[last()]/a/text()')
print(html_data)

在這裏插入圖片描述

  • 查找倒數第二個li標籤裏的a標籤的href屬性
html_data = html.xpath('//li[last()-1]/a/text()')
print(html_data)

打印
['item 4 ']
from lxml import etree
print("------------")
text = '''
<div>
<ul>
    <li class="item-0"><a href="https://s1.bdstatic.com/">item 0 </a></li>
        <li class="item-1"><a href="https://s2.bdstatic.com/">item 1 </a></li>
        <li class="item-2"><a href="https://s3.bdstatic.com/">item 2 </a></li>
        <li class="item-3"><a href="https://s4.bdstatic.com/">item 3 </a></li>
        <li class="item-4"><a href="https://s5.bdstatic.com/">item 4 </a></li>
        <li class="item-5"><a href="https://s6.bdstatic.com/">item 5 </a></li>
</ul>
</div>
'''

html = etree.HTML(text)
# 獲取第一個
result = html.xpath('//li[1]/a/text()')
print(result)
# 獲取最後一個
result = html.xpath('//li[last()]/a/text()')
print(result)
# 獲取前兩個
result = html.xpath('//li[position()<3]/a/text()')
print(result)
# 獲取倒數第三個
result = html.xpath('//li[last()-2]/a/text()')
print(result)

"""
運行結果:

['item 0 ']
['item 5 ']
['item 0 ', 'item 1 ']
['item 3 ']
"""

6. 項目實戰

Python3爬蟲學習-妹子網爬取MM圖片批量下載 (詳細介紹)。

7. XPATH參考文檔:

XPath 中函數文檔參考:http://www.w3school.com.cn/xpath/xpath_functions.asp
軸的用法:http://www.w3school.com.cn/xpath/xpath_axes.asp
XPath 的用法:http://www.w3school.com.cn/xpath/index.asp
Python lxml 的用法:http://lxml.de
官方文檔:https://www.w3.org/TR/xpath/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章