首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么嵌套XPATH条件中的函数会导致错误?

为什么嵌套XPATH条件中的函数会导致错误?
EN

Stack Overflow用户
提问于 2020-06-17 19:19:52
回答 1查看 178关注 0票数 1

这是一个关于从webDrv.find_elements_by_xpath()调用中接收到的"xpath表达式无效“错误的问题。

背景

在求职网站上搜索包含目标职务标题文本的元素,例如"scrum master“(归一化为lower()),在元素中找到,例如

代码语言:javascript
复制
<a href="/jobs/view/1836192833/">
    Scrum MASTER
</a>

Selenium-Python查询..。

aJobTitle = getNormalJobTitle(...) # to match "scrum master" with "Scrum Master" "SCRUM Master" etcA s = '// *[contains(translate(text(),"ABCDEFGHIJKLMNOPURSTUWXYZ", "abcdefghijklmnopurstuwxyz"), "' + aJobTitle + '")]' jobNodes = webDrv.find_elements_by_xpath(s)

效果很好。所有"Scrum MASTER“、"Scrum Master”、“Scrum master”等元素都返回。

然而,当一个网站--无论出于什么原因--包含其他元素时,例如,

<a href="/jobs/view/1836192833/"> Scrum Master <!----> </a>

上面的查询什么也找不到。

使用不同的xpath表单--并且在不使用lower()规范化的情况下工作。

s = "//*[text()[contains(.,'" + "Scrum MASTER" + "')]]" jobNodes = webDrv.find_elements_by_xpath(s)

效果很好。"Scrum MASTER“元素全部返回(当然不是"Scrum Master”等等)

我的问题

但是,当我试图使用小写的规范化职位标题搜索时,将对text()的调用替换为对translate(text(),,)的调用。

aJobTitle = getNormalJobTitle(...) # "scrum master" s = "//*[translate(text(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')[contains(.,'" + aJobTitle + "')]]"

我被请到

Exception has occurred: InvalidSelectorException Message: Given xpath expression "//*[translate(tex(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')[contains(.,'scrum master')]]" is invalid: [Exception... "<no message>" nsresult: "0x80600008 (<unknown>)" location: "JS frame :: chrome://marionette/content/element.js :: element.findByXPathAll :: line 410" data: no] File "C:myfile.py JS.py", line 41, in <module> jn = liJobsElement.find_elements_by_xpath(s)

所以最后..。

1)为什么函数的添加会导致错误?

2)如何实现规范化,使我能够找到所有的案例形式,例如,一个职位?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-18 01:54:15

你写:translate(text(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')[

不能在字符串中使用谓词(即:translate函数的输出)。这就是为什么您的XPath无效。可以测试的是元素、属性和text()节点。

关于您的问题,在我看来,您的第一个XPath看起来很好。但是一些XPath引擎并不认为它是有效的。工作的XPath可以是:

使用normalize-space函数(我们删除contains函数):

代码语言:javascript
复制
//*[translate(normalize-space(),"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")="scrum master"]

使用上下文项. (而不是有问题的text()),但我们必须指定元素名称(a)或添加谓词(没有子元素):

代码语言:javascript
复制
//a[contains(translate(.,"ABCDEFGHIJKLMNOPURSTUWXYZ", "abcdefghijklmnopurstuwxyz"),"scrum master")]

//*[contains(translate(.,"ABCDEFGHIJKLMNOPURSTUWXYZ", "abcdefghijklmnopurstuwxyz"),"scrum master")][count(./*)=0]

因此,总而言之,你可以使用这样的东西:

代码语言:javascript
复制
s = '//*[translate(normalize-space(),"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")="%s"]'%str(aJobTitle)
jobNodes = webDrv.find_elements_by_xpath(s)

代码语言:javascript
复制
s = '//a[contains(translate(.,"ABCDEFGHIJKLMNOPURSTUWXYZ", "abcdefghijklmnopurstuwxyz"),"%s")]'%str(aJobTitle)
jobNodes = webDrv.find_elements_by_xpath(s)

代码语言:javascript
复制
s = '//*[contains(translate(.,"ABCDEFGHIJKLMNOPURSTUWXYZ", "abcdefghijklmnopurstuwxyz"),"%s")][count(./*)=0]'%str(aJobTitle)
jobNodes = webDrv.find_elements_by_xpath(s)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62436792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档