在Selenium(Python)中使用XPath选择器'following-sibling::text()

9 投票
3 回答
19174 浏览
提问于 2025-04-17 10:36

我正在尝试使用Selenium(用Python)从一个网站提取一些信息。我一直在用XPath选择元素,但在使用“following-sibling”选择器时遇到了问题。下面是相关的HTML代码:

<span class="metadata">
    <strong>Photographer's Name: </strong>
    Ansel Adams
</span>

我可以用

In [172]: metaData = driver.find_element_by_class_name('metadata')

In [173]: metaData.find_element_by_xpath('strong').text
Out[173]: u"Photographer's Name:"

选择到“摄影师的名字”。现在我想选择在这个标签后面的文本部分(在这个例子中是“安塞尔·亚当斯”)。我以为可以用“following-sibling”选择器,但我收到了以下错误:

In [174]: metaData.find_element_by_xpath('strong/following-sibling::text()')
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (328, 0))
... [NOTE: Omitted the traceback for brevity] ...
InvalidSelectiorException: Message: u'The given selector strong/following-sibling::text() is either invalid or does not result in a WebElement. The following error occurred:\n[InvalidSelectorError] The result of the xpath expression "strong/following-sibling::text()" is: [object Text]. It should be an element.' 

有没有人知道为什么这样不行呢?

3 个回答

2

要获取文本“Ansel Adams”,只需要使用 metaData.get_text()。我觉得 find_element_by_* 这个方法是找不到文本节点的。

3

这个问题在一个关于Selenium的错误报告中有说明:

http://code.google.com/p/selenium/issues/detail?id=5459

“你的xpath没有返回一个元素,而是返回了一个文本节点。虽然在Selenium RC(以及Selenium IDE)中这样做是可以接受的,但在WebDriver的WebElement接口中,方法需要的是一个元素对象,而不仅仅是任何DOM节点对象。WebDriver的工作方式是正常的。要解决这个问题,你需要修改HTML代码,把文本节点放在一个元素里面,比如放在一个<div>标签里。”

8

@RossPatterson说得对。问题在于,文本'Ansel Adams'并不是一个WebElement,所以你不能使用find_elementfind_elements。如果你把你的HTML改成

<span class="metadata">
    <strong>Photographer's Name: </strong>
    <strong>Ansel Adams</strong>
</span>

那么find_element_by_xpath('strong/following-sibling::*[1]').text就会返回'Ansel Adams'。

撰写回答