无效的选择器错误:使用xpath和Selenium

时间:2016-02-18 19:54:14

标签: python selenium xpath

我正在尝试使用以下格式的星号来填写以逗号分隔的作者列表[重要]:

First Last,First Last,First Last *,First Last

我正在抓取的html部分非常复杂,但我已经成功测试了一个xpath,它产生了我想要的文本和符号。

//span[@class="hlFld-ContribAuthor"]/span[@class="hlFld-ContribAuthor"]/a/text() | //span[@class="NLM_x"]/x/text() | //a[@class="ref"]/sup/text()

结果如下: enter image description here

然而,当我在我的python代码中使用该公式时,我收到一个错误。

我的代码:

# get authors
xpath = "//span[@class=\"hlFld-ContribAuthor\"]/span[@class=\"hlFld-ContribAuthor\"]/a/text() | //span[@class=\"NLM_x\"]/x/text() | //a[@class=\"ref\"]/sup/text()"
authors = driver.find_element_by_xpath(xpath)
print str(authors)

错误:

  

InvalidSelectorException:Message:给定的选择器   //跨度[@类= “hlFld-ContribAuthor”] /跨度[@类= “hlFld-ContribAuthor”] /一个/文本()   | // span [@ class =“NLM_x”] / x / text()| //一个[@ class =“ref”] / sup / text()是   要么无效,要么不会导致WebElement。以下错误   发生:InvalidSelectorError:xpath表达式的结果   “//跨度[@类=” hlFld-ContribAuthor “] /跨度[@类=” hlFld-ContribAuthor“] /一个/文本()   | // span [@ class =“NLM_x”] / x / text()| // a [@ class =“ref”] / sup / text()“是:   [对象文本]。它应该是一个元素。

如何让selenium以正确的顺序获取我需要的正确文本和符号?没有换行,我无法打印xpath的结果。

编辑:通过从xpaths中删除/ text()来解决xpath错误

1 个答案:

答案 0 :(得分:1)

函数driver.find_element_by_xpath(my_xpath)期望在找到由my_xpath标识的节点时找到DOM元素。如果没有,则会抛出错误。您的XPath表达式都返回文本节点,因此会导致错误。

要返回DOM元素,请将XPath表达式更改为:

"//span[@class=\"hlFld-ContribAuthor\"]/span[@class=\"hlFld-ContribAuthor\"]/a | //span[@class=\"NLM_x\"]/x | //a[@class=\"ref\"]/sup

此外,由于您要返回多个元素,因此应使用driver.find_elements_by_xpath(注释复数)而不是driver.find_element_by_xpath

然后,您可以通过循环authors从每个作者元素中获取所需的文本:

for author in authors:
    print(author.text)