Комментарии в ET: больше, чем комментарий - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть XML-файл, например:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Chapter PUBLIC 'blub' 'blub.dtd'>
<Chapter>
    <Tag>
        <TagEntry y.validity.allowed="true" y.validity.mode="positive">
            <!--Kommentar 1-->
            <!--Kommentar 2-->
            <!--Kommentar 3-->Inhalt 1<!--Kommentar 4--></TagEntry>
        <TagEntry>
            Inhalt 2 erg&#228;nzt <!--Kommentar 5-->mit Umlaut
        </TagEntry>
        <TagBase>
            <!--Kommentar 6-->
            <!--Kommentar 7-->Inhalt 3</TagBase>
        <TagNothing>
            Inhalt 3<!--Kommentar 8-->
        </TagNothing>
    </Tag>
</Chapter>

Теперь я хочу перебрать комментарии. Я сделал это с lxml.etree как ET-дерево:

comments = root.xpath('//comment()')
for comment in comments:
    print(ET.tostring(comment))

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

b'<!--Kommentar 1-->'
b'<!--Kommentar 2-->'
b'<!--Kommentar 3-->Inhalt 1'
b'<!--Kommentar 4-->'
b'<!--Kommentar 5-->mit Umlaut\n\t\t'
b'<!--Kommentar 6-->'
b'<!--Kommentar 7-->Inhalt 3'
b'<!--Kommentar 8-->\n\t\t'

Можеткто-то объяснит мне, почему это происходит и как я могу изменить xpath-выражение, чтобы просто возвращать узлы комментариев без добавления текста в конец комментария.

Спасибо!

1 Ответ

3 голосов
/ 07 ноября 2019

Узлы комментариев записываются с включенным текстом tail (по умолчанию; см. https://lxml.de/api/lxml.etree-module.html#tostring).

Чтобы избавиться от хвостов, измените

print(ET.tostring(comment))

на

print(ET.tostring(comment, with_tail=False))

Если вас интересует содержание комментариев, а не разметка, используйте это:

print(comment.text)
...