一、XPath
XPath(XML Path Language)是一種基於XML的語言,它用於定位XML中的數據。XPath可以通過元素和屬性來遍歷XML文檔,並根據有關元素和屬性的信息來選擇想要的內容。
在Python中,可以使用第三方庫lxml來使用XPath,相應地,我們可以通過lxml中的etree對象來實現XPath表達式的解析、查詢和操作。
from lxml import etree
# 構建解析器
parser = etree.HTMLParser()
# 解析網頁
html = etree.parse("http://www.example.com", parser)
# 用XPath表達式提取所有a標籤的href屬性
links = html.xpath("//a/@href")
二、使用XPath方法的返回類型是
使用XPath方法的返回類型主要有以下幾種:
1. 字元串類型
如果XPath表達式查詢的是純文本內容,返回的則是字元串類型,例如在下面的HTML代碼中,如果我們要提取「Hello World」這段文本內容,XPath表達式則為「//p/i/text()」。
<html>
<body>
<p><i>Hello World</i></p>
</body>
</html>
2. 列表類型
如果XPath表達式查詢的是多個元素,那麼返回的則是一個列表類型,例如在下面的HTML代碼中,如果我們想要提取所有的鏈接,XPath表達式則為「//a/@href」。
<html>
<body>
<a href="http://www.example.com">Example Site</a>
<a href="http://www.example.com/blog">Blog</a>
<a href="http://www.example.com/about">About Us</a>
</body>
</html>
3. 布爾類型
如果XPath表達式查詢的是是否存在某個元素或者屬性,那麼返回的則是一個布爾類型,例如在下面的HTML代碼中,如果我們想要判斷是否存在id為「main」的元素,XPath表達式則為「boolean(//div[@id=’main’])」。
<html>
<body>
<div id="main"></div>
</body>
</html>
三、XPath定位
XPath定位主要指在XML或HTML文檔中使用XPath表達式定位元素和屬性。XPath表達式可以通過以下方式定位元素:
1. 標籤名稱
我們可以通過標籤名稱來定位元素,例如在下面的HTML代碼中,如果我們想要定位所有的段落標籤p,XPath表達式則為「//p」。
<html>
<body>
<p>This is the first paragraph.</p>
<p>This is the second paragraph.</p>
</body>
</html>
2. 屬性
我們可以通過元素的屬性來定位元素,例如在下面的HTML代碼中,如果我們想要定位所有class屬性值為「message」的div元素,XPath表達式則為「//div[@class=’message’]」。
<html>
<body>
<div class="message">Hello World!</div>
<div class="message">Welcome to my website!</div>
</body>
</html>
3. 父元素
我們可以通過元素的父元素來定位元素,例如在下面的HTML代碼中,如果我們想要定位第二個span元素,XPath表達式則為「//div[@class=’article’]//span[2]」。
<html>
<body>
<div class="article">
<span>Title 1</span>
<span>Content 1</span>
</div>
<div class="article">
<span>Title 2</span>
<span>Content 2</span>
</div>
</body>
</html>
四、XPath插件
XPath插件可以通過添加一些函數和操作符來擴展XPath的功能。在Python中,可以使用第三方庫lxml的XPath插件來實現更加複雜的XPath表達式。
例如,如果我們想要查詢文檔中包含某些特定單詞的所有段落,可以使用lxml的XPath插件,其中「contains」函數可以用來判斷一個元素是否包含某些文本內容。
import re
from lxml import etree
# 自定義contains函數
def contains(text, words):
pattern = "|".join(words)
return re.search(pattern, text) is not None
# 添加contains函數到XPath插件
etree.XPathEvaluator.add_function('contains', contains)
# 查詢文檔中包含特定單詞的所有段落
html = etree.fromstring("<html><body><p>hello world</p><p>goodbye</p></body></html>")
paragraphs = html.xpath("//p[contains(.,['hello', 'goodbye'])]")
五、XPath讀法
XPath的讀法和語法類似於一個查詢語言,主要包含以下幾個部分:
1. 軸
軸指的是元素與其祖先、子孫以及同級元素之間的關係。例如,「/軸::parent::*/child::p」表示選擇所有的段落元素的父元素。
2. 選擇器
選擇器用來選擇元素和屬性。例如,「/html/body/p」表示選擇html元素下的body元素下的所有段落元素。
3. 謂語
謂語用來限定選擇器的範圍。例如,「//div[@class=’message’]」表示選擇所有class屬性值為「message」的div元素。
六、XPath方法的使用
XPath方法可以用來操作元素和屬性,主要包括以下幾個方法:
1. text()
text()方法用來獲取元素的文本內容,例如,「//p/text()」表示獲取所有段落元素中的文本內容。
2. @
@方法用來獲取元素的屬性值,例如,「//a/@href」表示獲取所有鏈接的href屬性值。
3. count()
count()方法用來獲取元素的數量,例如,「count(//p)」表示獲取所有段落元素的數量。
七、XPath翻譯
XPath翻譯是指將XPath表達式轉換成其他語言的表達式,例如在Python中,可以使用lxml的XPath函數將XPath表達式轉換成Python語言的表達式。
from lxml import etree
# 將XPath表達式轉換成Python語言的表達式
expr = etree.XPath("//a/@href")
code = expr._compile()
print(code.co_code)
八、XPath爬蟲
XPath在網頁爬蟲中應用廣泛,它可以通過對網頁進行解析和查詢來抽取所需的信息。使用Python和lxml,我們可以實現一個簡單的XPath爬蟲。
import requests
from lxml import etree
# 請求網頁
response = requests.get("http://www.example.com")
# 構建解析器
parser = etree.HTMLParser()
# 解析網頁
html = etree.HTML(response.text, parser)
# 提取網頁中的段落內容
paragraphs = html.xpath("//p/text()")
for paragraph in paragraphs:
print(paragraph)
九、XPath定位文本
XPath定位文本主要指定位文本節點的位置信息。在XPath中,使用「text()」方法來定位文本節點,例如,「//p/text()」表示選擇所有段落元素中的文本內容。
十、XPath正則表達式選取
XPath可以使用正則表達式來選取匹配的節點,例如,「//p[contains(text(), ‘regexp:Hello.*’)]/text()」表示選擇所有段落元素中匹配「Hello.*」正則表達式的文本內容。
小結
本文對XPath用法進行了詳細的闡述,涉及到了XPath的概述、使用方法、定位元素與屬性、XPath插件、XPath讀法、XPath方法的使用、XPath翻譯、XPath爬蟲、XPath定位文本和XPath正則表達式選取等方面的內容。希望能夠為大家使用XPath提供一些幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/241330.html
微信掃一掃
支付寶掃一掃