Неверная ошибка выбора: веб-сканирование различных видов текста из нескольких интервалов с использованием xpath и Selenium

62
6

Я пытаюсь очистить список авторов, разделенных запятыми, звездочкой в следующем формате [важно]:

Первый Последний, Первый Последний, Первый Последний *, Первый Последний

Раздел 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: Сообщение: данный селектор //span [@class= "hlFld-ContribAuthor"]/span [@class= "hlFld-ContribAuthor"]/a/text() | //span [@class= "NLM_x"]/x/text() | //a [@class= "ref"]/sup/text() либо недействителен, либо не приводит к использованию WebElement. Произошла следующая ошибка: InvalidSelectorError: результат выражения xpath://span [@class= "hlFld-ContribAuthor"]/span [@class= "hlFld-ContribAuthor"]/a/text() |//span [ @class= "NLM_x"]/x/text() |//a [@class= "ref"]/sup/text() "is: [object Text]. Это должен быть элемент.

Как получить селен, чтобы получить правильный текст и символы, которые мне нужны в правильном порядке? Я не смог распечатать результаты моего xpath без новых строк.

EDIT: решена ошибка xpath, удалив /text() из xpaths

спросил(а) 2021-01-19T11:42:02+03:00 2 месяца, 3 недели назад
1
Решение
62

Функция driver.find_element_by_xpath(my_xpath) ожидает найти элемент DOM, когда он найдет узел, идентифицированный my_xpath. Если это не так, это вызывает ошибку. В выражениях 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)

ответил(а) 2021-01-19T11:42:02+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема