这是一个关于从webDrv.find_elements_by_xpath()调用中接收到的"xpath表达式无效“错误的问题。
背景
在求职网站上搜索包含目标职务标题文本的元素,例如"scrum master“(归一化为lower()),在元素中找到,例如
<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)如何实现规范化,使我能够找到所有的案例形式,例如,一个职位?
发布于 2020-06-18 01:54:15
你写:translate(text(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')[
不能在字符串中使用谓词(即:translate函数的输出)。这就是为什么您的XPath无效。可以测试的是元素、属性和text()节点。
关于您的问题,在我看来,您的第一个XPath看起来很好。但是一些XPath引擎并不认为它是有效的。工作的XPath可以是:
使用normalize-space函数(我们删除contains函数):
//*[translate(normalize-space(),"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")="scrum master"]使用上下文项. (而不是有问题的text()),但我们必须指定元素名称(a)或添加谓词(没有子元素):
//a[contains(translate(.,"ABCDEFGHIJKLMNOPURSTUWXYZ", "abcdefghijklmnopurstuwxyz"),"scrum master")]
//*[contains(translate(.,"ABCDEFGHIJKLMNOPURSTUWXYZ", "abcdefghijklmnopurstuwxyz"),"scrum master")][count(./*)=0]因此,总而言之,你可以使用这样的东西:
s = '//*[translate(normalize-space(),"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")="%s"]'%str(aJobTitle)
jobNodes = webDrv.find_elements_by_xpath(s)或
s = '//a[contains(translate(.,"ABCDEFGHIJKLMNOPURSTUWXYZ", "abcdefghijklmnopurstuwxyz"),"%s")]'%str(aJobTitle)
jobNodes = webDrv.find_elements_by_xpath(s)或
s = '//*[contains(translate(.,"ABCDEFGHIJKLMNOPURSTUWXYZ", "abcdefghijklmnopurstuwxyz"),"%s")][count(./*)=0]'%str(aJobTitle)
jobNodes = webDrv.find_elements_by_xpath(s)https://stackoverflow.com/questions/62436792
复制相似问题