例項帶你快速入門XPath語法和lxml模組

2021-09-17 22:46:52 字數 4047 閱讀 6339

xpath(xml path language)是一門在xml和html文件中查詢資訊的語言,可用來在xml和html文件中對元素和屬性進行遍歷。

chrome外掛程式xpath helper。

firefox外掛程式try xpath。

xpath 使用路徑表示式來選取 xml 文件中的節點或者節點集。這些路徑表示式和我們在常規的電腦檔案系統中看到的表示式非常相似。

表示式描述

示例結果

nodename

選取此節點的所有子節點

bookstore

選取bookstore下所有的子節點

/如果是在最前面,代表從根節點擊取。否則選擇某節點下的某個節點

/bookstore

選取根元素下所有的bookstore節點

//從全域性節點中選擇節點,隨便在哪個位置

//book

從全域性節點中找到所有的book節點

@選取某個節點的屬性

//book[@price]

選擇所有擁有price屬性的book節點

.當前節點

./a選取當前節點下的a標籤

謂語用來查詢某個特定的節點或者包含某個指定的值的節點,被嵌在方括號中。

在下面的**中,我們列出了帶有謂語的一些路徑表示式,以及表示式的結果:

路徑表示式

描述/bookstore/book[1]

選取bookstore下的第乙個子元素

/bookstore/book[last()]

選取bookstore下的倒數第二個book元素。

bookstore/book[position()< 3]

選取bookstore下前面兩個子元素。

//book[@price]

選取擁有price屬性的book元素

//book[@price=10]

選取所有屬性price等於10的book元素

*表示萬用字元。

萬用字元描述

示例結果

*匹配任意節點

/bookstore/*

選取bookstore下的所有子元素。

@*匹配節點中的任何屬性

//book[@*]

選取所有帶有屬性的book元素。

通過在路徑表示式中使用「|」運算子,可以選取若干個路徑。

示例如下:

//bookstore/book | //book/title

# 選取所有book元素以及book元素下所有的title元素

[上傳失敗…(image-3e6244-1554966466416)]

lxml 是 乙個html/xml的解析器,主要的功能是如何解析和提取 html/xml 資料。

lxml和正則一樣,也是用 c 實現的,是一款高效能的 python html/xml 解析器,我們可以利用之前學習的xpath語法,來快速的定位特定元素以及節點資訊。

lxml python 官方文件:

需要安裝c語言庫,可使用 pip 安裝:pip install lxml

我們可以利用他來解析html**,並且在解析html**的時候,如果html**不規範,他會自動的進行補全。示例**如下:

# 使用 lxml 的 etree 庫

from lxml import etree

text = '''

'''#利用etree.html,將字串解析為html文件

html = etree.html(text)

# 按字串序列化html文件

result = etree.tostring(html)

print(result)

輸入結果如下:

可以看到。lxml會自動修改html**。例子中不僅補全了li標籤,還新增了body,html標籤。

除了直接使用字串進行解析,lxml還支援從檔案中讀取內容。我們新建乙個hello.html檔案:

然後利用etree.parse()方法來讀取檔案。示例**如下:

from lxml import etree

# 讀取外部檔案 hello.html

html = etree.parse('hello.html')

result = etree.tostring(html, pretty_print=true)

print(result)

輸入結果和之前是相同的。

獲取所有li標籤:

from lxml import etree

html = etree.parse('hello.html')

print type(html) # 顯示etree.parse() 返回型別

result = html.xpath('//li')

print(result) # 列印標籤的元素集合

獲取所有li元素下的所有class屬性的值:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li/@class')

print(result)

獲取li標籤下href為www.baidu.com的a標籤:

獲取li標籤下所有span標籤:

from lxml import etree

html = etree.parse('hello.html')

#result = html.xpath('//li/span')

#注意這麼寫是不對的:

#因為 / 是用來獲取子元素的,而 並不是 的子元素,所以,要用雙斜槓

result = html.xpath('//li//span')

print(result)

獲取li標籤下的a標籤裡的所有class:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li/a//@class')

print(result)

獲取最後乙個li的a的href屬性對應的值:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li[last()]/a/@href')

# 謂語 [last()] 可以找到最後乙個元素

print(result)

獲取倒數第二個li元素的內容:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li[last()-1]/a')

# text 方法可以獲取元素內容

print(result[0].text)

獲取倒數第二個li元素的內容的第二種方式:

from lxml import etree

html = etree.parse('hello.html')

result = html.xpath('//li[last()-1]/a/text()')

print(result)

flask 帶你快速入門

建立乙個python檔案 hello.py from flask import flask defhello world 檢視函式 return hello world 返回乙個字串 if name main 用python直譯器來執行 python hello.py running on上面 首先...

flask 帶你快速入門

from flask import flask defhello world 檢視函式 return hello world 返回乙個字串 if name main python hello.py running on接下來,我們建立乙個該類的例項,第乙個引數是應用模組或者包的名稱。如果你使用單 塊...

xpath 語法運用例項 爬取boos

一 url的處理 import urllib.request from lxml import etree def bo url url headers for bo in bo list bo dict 職位型別 bo.xpath li h3 div class job title text bo...