Это вопрос об ошибке «xpath expression is invalid», полученной в результате вызова webDrv.find_elements_by_xpath ().
Background
При поиске на сайте вакансий для элементов, содержащих текст названия целевой должности, например, «scrum master» (нормализованный до lower ()), найденный в таком элементе, как
<a href="/jobs/view/1836192833/">
Scrum MASTER
</a>
Selenium- Python query ...
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, "et c. Возвращены.
Однако, когда веб-сайт - по каким-либо причинам - включает другие элементы , например,
<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» и c., Конечно)
Моя проблема
Однако, когда я пытаюсь выполнить поиск, используя нормализованное название должности в нижнем регистре, заменяя вызов 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) Как мне добиться такой нормализации, чтобы я мог найти все регистры, например, название должности?