在Selenium(Python)中使用XPath选择器'following-sibling::text()
我正在尝试使用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_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'。