[英]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.