使用XPATH、python和selenium检索不属于<a>的文本节点?

2024-06-02 09:10:41 发布

您现在位置:Python中文网/ 问答频道 /正文

在以下链接上:https://classicdb.ch/?quest=788

在这里//*[@id="main-contents"]/div[1]/table[1]/tbody/tr/td 它包含一个文本

Mottled Boar slain (10)

//*[@id="main-contents"]/div[1]/table[1]/tbody/tr/td/a

仅包含:

Mottled Boar

我只需要第二部分,包括:

slain (10)

在带有selenium的python中,我尝试使用以下命令直接访问节点:

//*[@id="main-contents"]/div[1]/table[1]/tbody/tr/td/text()

但是,webdriver只能包含webelements,不能包含文本节点

The result of the xpa th expression "//*[@id="main-contents"]/div[1]/table[1]/tbody/tr/td/a/following-sibling::text()" is: [object Text]. It should be an element.

我也试过:

//*[@id="main-contents"]/div[1]/table[1]/tbody/tr/td/a/following-sibling::text()

但是返回相同的错误,即它应该是元素而不是对象文本

我已经找到了一个解决方法,首先只选择文本,然后从整个文本中减去它-但这很难看。 如何正确实现这一点

谢谢你

编辑:我不能在代码中使用特定的变量,比如'slain'或'motted Boar',因为这些变量在其他情况下可能会改变


Tags: text文本divid节点maincontentstable
2条回答

你说得对。您可以尝试这种方法直接从该节点获取文本。您将需要lxml导入

from lxml import html

tree = html.fromstring(driver.page_source)
myText = tree.xpath("//*[@id='main-contents']/div[1]/table[1]/tbody/tr/td/a/following-sibling::text()")

print(str(myText).replace('\\t', ''))

试试这个xpath

//table[@class='iconlist']//tr//td[contains(.,'slain')]//a[contains(.,'Mottled Boar')]

编辑

//table[@class='iconlist']//tr//td//a

使用javaScript执行器。其中firstChild将返回Mottled BoarlastChild将返回slain (10)

driver.get("https://classicdb.ch/?quest=788")
print(driver.execute_script('return arguments[0].lastChild.textContent;', driver.find_element_by_xpath("//table[@class='iconlist']//tr//td[1]")))
print(driver.execute_script('return arguments[0].firstChild.textContent;', driver.find_element_by_xpath("//table[@class='iconlist']//tr//td[1]")))

相关问题 更多 >