我正在尝试使用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.'
关于为什么这不起作用的任何想法?
答案 0 :(得分:8)
@RossPatterson是正确的。问题是“Ansel Adams”文本不是WebElement
,因此您无法使用find_element
或find_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表达式。