一、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