Получить внутренний XML из LXML - PullRequest
0 голосов
/ 05 января 2019

У меня есть следующая строка, которая является частью большего XML-документа:

content = '<odvNameElem stopID="9001002"><itdMapItemList/>Rathaus</odvNameElem>'

И я хочу получить доступ к Rathaus. Мой текущий подход заключается в том, чтобы проанализировать его с помощью lxml и попытаться получить доступ к тексту элемента 'odvNameElem' :

from lxml import etree
content = '<odvNameElem stopID="9001002"><itdMapItemList/>Rathaus</odvNameElem>'
root = etree.fromstring(content)
print(root.text)

Это, однако, приводит к None. Что я делаю не так?

etree.__version__ = '4.2.5'

Я не уверен, почему работает следующее: root.xpath("string()") но root.xpath("//text()") возвращает только пустой список. Может кто-нибудь, пожалуйста, объясните это?

1 Ответ

0 голосов
/ 05 января 2019

Строка "Rathaus" является значением свойства tail элемента itdMapItemList. Примеры:

root.xpath("itdMapItemList")[0].tail
root.find("itdMapItemList").tail

См. https://lxml.de/tutorial.html#elements-contain-text.


root.xpath("string()") возвращает объединение строковых значений корневого узла и его потомков, который в данном случае действительно является "Rathaus".

См. https://www.w3.org/TR/xpath-10/#function-string.


root.xpath("//test") не имеет смысла (нет элемента test). Вы имели в виду root.xpath("//text()")?

root.xpath("//text()") возвращает список всех текстовых узлов, который в данном случае равен ['Rathaus'].

Если входной XML изменен на

<odvNameElem stopID="9001002">ABC<itdMapItemList/>Rathaus</odvNameElem>

тогда результат ['ABC', 'Rathaus']

...