簡體   English   中英

絕對 xpath 選擇了錯誤的元素和其中的文本

[英]absolute xpath selecting the wrong element and text inside it

我試圖從這個頁面上抓取一些數據: https://www.blockchain.com/btc/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

我完全感到困惑...

“交易次數”的絕對路徑是 /html[1]/body[1]/div[1]/div[2]/div[1]/table[1]/tbody[1]/tr[2 ]/td[1]

當我運行代碼時:

print driver.find_element(By.XPATH, "/html/body/div/div[2]/div[1]/table/tbody/tr[2]/td[1]").text

驅動程序返回“無輸入(新生成的硬幣)”

其中有路徑 /html[1]/body[1]/div[1]/div[3]/div[1]/table[1]/tbody[1]/tr[2]/td[1]/ b[1]

我發現很難理解為什么絕對路徑會選擇不同的值。

所以當我運行代碼時:

print driver.find_element(By.XPATH, "/html[1]/body[1]/div[1]/div[3]/div[1]/table[1]/tbody[1]/tr[2]/td[1]/b[1]").text

它返回元素不存在(?)

.text將返回 WebElement 下的所有文本,包括后代文本。 第一個 xpath 返回元素<td class="txtd hidden-phone mobile-f12 stack-mobile"> ,“無輸入(新生成的硬幣)”文本是其中的一部分。

第二個 xpath 不起作用,因為它不正確, div[3]必須是div[2] ,這個位置只有 2 個<div>

*使用絕對的 xpath 是不好的做法,請避免。

確實很奇怪; Firefox 和 Chrome 都為該元素顯示相同的 xpath,但如果您使用requests獲取頁面,或查看其源代碼,則其中沒有<tbody>元素。 獲取事務數(即1 )的正確 xpath 表達式是

   /html/body/div/div/div/table[1]/tr[2]/td[2]/text()

作為解釋為什么它起作用,試試這個:

url = """
https://www.blockchain.com/btc/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
"""
import lxml
import requests
resp = requests.get(url)

tree = lxml.html.fromstring(resp.text)
print(tree.xpath("/html/body/div/div/div/table[1]/tr[2]/td[2]/text()")

Output:

['1', '\n']

而且,由於@Guy 是正確的並且您應該避免使用絕對路徑(而您的情況就是完美的例子),您可以通過使用獲得相同的 output

print(tree.xpath("//table/tr[2]/td[2]/text()")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM