在Selenium(Python)中使用XPath Selector'follow-sibling :: text()'

时间:2012-01-19 09:32:12

标签: python xpath selenium

我正在尝试使用Selenium(在Python中)从网站中提取一些信息。我一直在选择带有XPath的元素,但是在使用以下兄弟选择器时遇到了麻烦。 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:"

我正在尝试选择标记后的文本部分(示例中为“Ansel Adams”)。我假设我可以使用以下兄弟选择器,但我收到以下错误:

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.' 

关于为什么这不起作用的任何想法?

4 个答案:

答案 0 :(得分: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'。

答案 1 :(得分:2)

要获取文字“Ansel Adams”,只需使用metaData.get_text()即可。我不相信find_element_by_*会允许您找到文本节点。

答案 2 :(得分:2)

本Selenium错误报告中记录了这一点: http://code.google.com/p/selenium/issues/detail?id=5459

“你的xpath没有返回一个元素;它返回一个文本节点。虽然这在Selenium RC(以及扩展,Selenium IDE)中完全可以接受,但WebDriver WebElement接口上的方法需要一个元素对象,不仅仅是任何DOM节点对象.WebDriver正在按预期工作。要解决此问题,您需要更改HTML标记以将文本节点包装在元素中,例如。“

答案 3 :(得分:1)

此代码适用于PHP:

$this->getText("//span[@class='metadata']/text()[2]");

我认为你应该尝试使用这样的xPath表达式。