Python 绝对xpath选择了错误的元素和其中的文本

Python 绝对xpath选择了错误的元素和其中的文本,python,selenium,xpath,Python,Selenium,Xpath,我正试图从本页中获取一些数据: 我真的很困惑 “事务数”的绝对路径是/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 print driver.find_element(By.XPATH, "/ht

我正试图从本页中获取一些数据:

我真的很困惑

“事务数”的绝对路径是/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
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
驱动程序返回“无输入(新生成的硬币)”

其路径为/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/body/div/div[2]/div[1]/table/tbody/tr[2]/td[1]").text
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

它返回元素不存在(?)

它确实很奇怪;Firefox和Chrome都为该元素显示相同的xpath,但是如果您使用
请求获取页面,或者查看其源代码,则其中没有
元素。获取事务数(即
1
)的正确xpath表达式是

作为对其工作原理的解释,请尝试以下方法:

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()")
输出:

['1','\n']

而且,既然@Guy是对的,你应该避免绝对路径(你的情况就是最好的例子),你可以通过使用

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

.text
将返回WebElement下的所有文本,包括子体文本。第一个xpath返回元素
,“无输入(新生成的硬币)”文本是其中的一部分

第二个xpath不工作,因为它不正确,
div[3]
需要是
div[2]
,此位置只有2个


*使用绝对xpath是不好的做法,请避免使用。

我想让您了解绝对xpath和相对xpath之间的区别。我使用了/没有//我认为使用源代码是不正确的。也许我忘了提到我正在使用Selenium+Python。webdriver不仅使用从服务器交付的元素,而且还使用经过各种操作的元素。无论如何,我使用了你的路径,仍然没有找到任何元素。在哪里可以找到元素?@CharlesLee-关于如何使用请求和lxml访问元素,请参阅编辑后的答案。我被告知不使用绝对xpath。有人告诉我,相对xpath在计算资源方面很费力。@CharlesLee他们错在哪里。两者都有相同的效率(顺便说一句,这与其他选择器相比是不好的),但是绝对xpath非常脆弱,html中的最小更改都会使其无效。DOM结构中的绝对xpath/html/body/div/div[2]/div[1]/table/tbody/tr[2]/td[1]应该是类表的第二个tr和第一个td=“table table striped”。我不明白你为什么会说它是……据我所知,它也不是后代……@CharlesLee这个元素就是你所说的元素。带有文本的
是这个元素的后代(实际上是直接子代)。这个xpath?/html/body/div/div[2]/div[1]/table/tbody/tr[2]/td[1]