Получить идентификатор, который начинается со строки, используя xpath - PullRequest
0 голосов
/ 17 февраля 2020

Я использую python 3.7, и я хочу напечатать все div с идентификаторами, которые начинаются с "def". Я не понимаю, почему мой пример кода не работает:

import xml.etree.ElementTree as ET
html = '<div> <div id="abc 123"></div> <div id="def hhh"></div> <div id="ghi test"></div> </div>'
root = ET.fromstring(html)
print( root.findall("//div[starts-with(@id, 'def')]") )

Результат:

SyntaxError: cannot use absolute path on element

Я действительно не понимаю, почему это не работает. Если это сработает, следующим шагом будет l oop через него и получить имена идентификаторов, используя .get("id").

Что я делаю не так?

1 Ответ

0 голосов
/ 17 февраля 2020

Здесь есть 2 разных вопроса, оба решаются другими вопросами.

Первый:

import xml.etree.ElementTree as ET
html = '<div> <div id="abc 123"></div> <div id="def hhh"></div> <div id="ghi test"></div> </div>'
root = ET.fromstring(html)

try:
    print( root.findall("//div[starts-with(@id, 'def')]") )
except SyntaxError as e:
    print e

См. В прямом эфире: https://ideone.com/PfpjYz Ошибка «невозможно использовать абсолютный путь для элемента» - это обрабатывается Python - ElementTree - нельзя использовать абсолютный путь для элемента

Вторая проблема, при использовании относительных элементов вы получаете другую ошибку:

import xml.etree.ElementTree as ET
html = '<div> <div id="abc 123"></div> <div id="def hhh"></div> <div id="ghi test"></div> </div>'
root = ET.fromstring(html)
try:
    print( root.findall(".//div[starts-with(@id, 'def')]") )
except SyntaxError as e:
    print e

См. В прямом эфире: https://ideone.com/BNc7My

Ошибка изменила «недопустимый предикат» - см. xpath-support - нет начала запуска

См .: Python XPath SyntaxError : неверный предикат для возможных решений.

Наконец, вы можете использовать другую библиотеку xml или обойти ограничения этой.

import lxml.etree
root = lxml.etree.fromstring(html)

print root.xpath(".//div[starts-with(@id, 'def')]")[0].attrib

См. Онлайн: https://ideone.com/Ie1j8F

Примечание : этот вопрос все еще повторяется и должен быть закрыт как таковой, но это долго, чтобы вписаться в комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...