Python使用XPath定位元素的入門實(shí)戰(zhàn)指南
在自動(dòng)化測試、爬蟲開發(fā)或 Web 數(shù)據(jù)分析中,XPath(XML Path Language) 是一種強(qiáng)大的工具,用于在 HTML/XML 文檔中精準(zhǔn)定位元素。Python 的 lxml、selenium 和 scrapy 等庫都支持 XPath,使其成為開發(fā)者必備的技能之一。
本文將詳細(xì)介紹 XPath 的基本語法、Python 中的使用方法,并通過 實(shí)戰(zhàn)案例 幫助你快速掌握 XPath 定位技巧。
1. XPath 是什么
XPath 是一種用于在 XML/HTML 文檔中導(dǎo)航和選擇節(jié)點(diǎn)的查詢語言。它可以通過 路徑表達(dá)式 定位元素,支持層級(jí)關(guān)系、屬性匹配、條件篩選等高級(jí)功能。
XPath 的優(yōu)勢(shì)
- 精準(zhǔn)定位:比 CSS 選擇器更靈活,支持復(fù)雜查詢。
- 跨瀏覽器兼容:適用于所有瀏覽器(如 Chrome、Firefox、Edge)。
- 支持動(dòng)態(tài)內(nèi)容:可結(jié)合
selenium定位動(dòng)態(tài)加載的元素。 - 適用于爬蟲:
scrapy和lxml均支持 XPath 解析 HTML。
2. XPath 基本語法
2.1 基本路徑表達(dá)式
| 表達(dá)式 | 說明 | 示例 |
|---|---|---|
/ | 從根節(jié)點(diǎn)開始 | /html/body/div |
// | 從任意節(jié)點(diǎn)開始(不限制層級(jí)) | //div(所有 <div>) |
. | 當(dāng)前節(jié)點(diǎn) | ./div(當(dāng)前節(jié)點(diǎn)的 <div>) |
.. | 父節(jié)點(diǎn) | //div/..(<div> 的父節(jié)點(diǎn)) |
@ | 匹配屬性 | //div[@class="header"] |
2.2 條件篩選(謂詞[])
| 表達(dá)式 | 說明 | 示例 |
|---|---|---|
[1] | 第一個(gè)匹配的元素 | //div[1](第一個(gè) <div>) |
[@id="xxx"] | 匹配特定屬性 | //input[@id="username"] |
[contains(@class, "xxx")] | 屬性包含某值 | //div[contains(@class, "header")] |
[starts-with(@class, "xxx")] | 屬性以某值開頭 | //div[starts-with(@class, "col-")] |
[text()="xxx"] | 匹配文本內(nèi)容 | //p[text()="Hello"] |
[last()] | 最后一個(gè)匹配的元素 | //div[last()] |
2.3 邏輯運(yùn)算符
| 運(yùn)算符 | 說明 | 示例 |
|---|---|---|
and | 邏輯與 | //div[@class="a" and @id="b"] |
or | 邏輯或 | //div[@class="a" or @class="b"] |
not() | 邏輯非 | //div[not(@class)](無 class 的 <div>) |
3. Python 中使用 XPath
3.1 使用lxml解析 HTML(適用于爬蟲)
from lxml import etree
html = """
<html>
<body>
<div class="header">
<h1>Welcome</h1>
<p class="desc">This is a demo.</p>
</div>
</body>
</html>
"""
# 解析 HTML
tree = etree.HTML(html)
# 使用 XPath 定位元素
h1 = tree.xpath('//h1/text()')[0] # 獲取 <h1> 的文本
desc = tree.xpath('//p[@class="desc"]/text()')[0] # 獲取 <p class="desc"> 的文本
print(f"Title: {h1}") # 輸出: Welcome
print(f"Description: {desc}") # 輸出: This is a demo.
3.2 使用selenium定位動(dòng)態(tài)元素(適用于自動(dòng)化測試)
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com")
# 使用 XPath 定位元素
element = driver.find_element(By.XPATH, '//input[@id="username"]')
element.send_keys("admin")
# 定位多個(gè)元素
elements = driver.find_elements(By.XPATH, '//div[contains(@class, "item")]')
for el in elements:
print(el.text)
driver.quit()
3.3 使用scrapy爬取數(shù)據(jù)(適用于爬蟲開發(fā))
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
start_urls = ["https://example.com"]
def parse(self, response):
# 使用 XPath 提取數(shù)據(jù)
titles = response.xpath('//h1/text()').getall()
links = response.xpath('//a/@href').getall()
for title, link in zip(titles, links):
yield {
"title": title.strip(),
"url": link,
}
4. XPath 實(shí)戰(zhàn)案例
案例 1:定位動(dòng)態(tài)加載的按鈕
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://demo.seleniumeasy.com/dynamic-loading-example.html")
# 等待按鈕出現(xiàn)并點(diǎn)擊
button = driver.find_element(
By.XPATH,
'//div[contains(@class, "btn-primary")][@id="startButton"]'
)
button.click()
案例 2:爬取電商網(wǎng)站商品信息
import requests
from lxml import etree
url = "https://example.com/products"
response = requests.get(url)
tree = etree.HTML(response.text)
# 提取商品名稱和價(jià)格
products = tree.xpath('//div[@class="product-item"]')
for product in products:
name = product.xpath('.//h2/text()')[0].strip()
price = product.xpath('.//span[@class="price"]/text()')[0].strip()
print(f"{name}: {price}")
案例 3:定位表格中的特定行
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/table-demo")
# 定位第二行的第三列(索引從 1 開始)
cell = driver.find_element(
By.XPATH,
'//table//tr[2]/td[3]'
)
print(cell.text)
5. XPath 調(diào)試技巧
瀏覽器開發(fā)者工具:
- 按
F12打開 DevTools。 - 按
Ctrl+F輸入 XPath 測試是否匹配目標(biāo)元素。
try-except 處理異常:
try:
element = driver.find_element(By.XPATH, '//div[@id="non-existent"]')
except Exception as e:
print(f"定位失敗: {e}")
使用 contains() 避免 class 順序問題:
# 錯(cuò)誤寫法(如果 class 順序變化會(huì)失效) '//div[@class="flex size-36"]' # 正確寫法(推薦) '//div[contains(@class, "flex") and contains(@class, "size-36")]'
6. 總結(jié)
- XPath 是一種強(qiáng)大的定位工具,適用于
lxml、selenium、scrapy等 Python 庫。 - 基本語法 包括
/、//、@、[]等,支持條件篩選和邏輯運(yùn)算。 - 實(shí)戰(zhàn)技巧:
- 使用
contains()避免class順序問題。 - 結(jié)合
selenium定位動(dòng)態(tài)元素。 - 在瀏覽器中調(diào)試 XPath 確保準(zhǔn)確性。
- 使用
掌握 XPath 后,你可以更高效地完成 Web 自動(dòng)化測試、爬蟲開發(fā)、數(shù)據(jù)分析 等任務(wù)。希望本文能幫助你快速上手 XPath!
到此這篇關(guān)于Python使用XPath定位元素的入門實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Python XPath定位元素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
打包Python代碼的常用方法實(shí)現(xiàn)程序exe應(yīng)用
Python是一門強(qiáng)大的編程語言,但在將Python代碼分享給其他人時(shí),讓他們安裝Python解釋器并運(yùn)行腳本可能有點(diǎn)繁瑣,這時(shí),將Python代碼打包成可執(zhí)行的應(yīng)用程序(.exe)可以大大簡化這個(gè)過程,本文將介紹幾種常用的方法,輕松地將Python代碼變成獨(dú)立的可執(zhí)行文件2023-12-12
Python高級(jí)編程之繼承問題詳解(super與mro)
這篇文章主要介紹了Python高級(jí)編程之繼承問題,結(jié)合實(shí)例形式詳細(xì)分析了Python多繼承、MRO順序及super調(diào)用父類等相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
解決pip安裝報(bào)錯(cuò)required?to?install?pyproject.toml-based?projec
這篇文章主要介紹了解決pip安裝報(bào)錯(cuò)required?to?install?pyproject.toml-based?projects問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Pytorch技法之繼承Subset類完成自定義數(shù)據(jù)拆分
這篇文章主要介紹了Pytorch技法之繼承Subset類完成自定義數(shù)據(jù)拆分,下文我們介紹一些下面是加載內(nèi)置訓(xùn)練數(shù)據(jù)集的常見操作,需要的小伙伴可以參考一下2022-02-02
Spring @Enable模塊驅(qū)動(dòng)原理及使用實(shí)例
這篇文章主要介紹了Spring @Enable模塊驅(qū)動(dòng)原理及使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python 爬取淘寶商品信息欄目的實(shí)現(xiàn)
這篇文章主要介紹了Python 爬取淘寶商品信息欄目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
Python接口自動(dòng)化淺析數(shù)據(jù)驅(qū)動(dòng)原理
這篇文章主要介紹了Python接口自動(dòng)化淺析數(shù)據(jù)驅(qū)動(dòng)原理,文中會(huì)詳細(xì)描述怎樣使用openpyxl模塊操作excel及結(jié)合ddt來實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng),有需要的朋友可以參考下2021-08-08
Python2.x利用commands模塊執(zhí)行Linux shell命令
這篇文章主要介紹了Python2.x利用commands模塊執(zhí)行Linux shell命令 的相關(guān)資料,需要的朋友可以參考下2016-03-03

