我正在尝试使用以下格式的星号来填写以逗号分隔的作者列表[重要]:
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()
然而,当我在我的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错误
答案 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)