Синтаксический анализ XML с помощью lxml и Python. - PullRequest
6 голосов
/ 14 января 2010

Пожалуйста, помогите мне решить мою проблему с lxml
(Я новичок в lxml).
Как я могу получить "Комментарий 1" из следующего файла:

<?xml version="1.0" encoding="windows-1251" standalone="yes" ?>
<!--Comment 1-->
<a>
   <!--Comment 2-->
</a>

Ответы [ 2 ]

12 голосов
/ 14 января 2010

Документы: учебник по lxml и поиск по "Комментариям"

Код:

import lxml.etree as et

text = """\
<?xml version="1.0" encoding="windows-1251" standalone="yes" ?>
<!--Comment 1a-->
<!--Comment 1b-->
<a> waffle
   <!--Comment 2-->
   blah blah
</a>
<!--Comment 3a-->
<!--Comment 3b-->
"""
print "\n=== %s ===" % et.__name__
root = et.fromstring(text)

for pre in (True, False):
    for comment in root.itersiblings(tag=et.Comment, preceding=pre):
        print pre, comment

for elem in root.iter():
    print
    print isinstance(elem.tag, basestring), elem.__class__.__name__, repr(elem.tag), repr(elem.text), repr(elem.tail)

Выход:

=== lxml.etree ===
True <!--Comment 1b-->
True <!--Comment 1a-->
False <!--Comment 3a-->
False <!--Comment 3b-->

True _Element 'a' ' waffle\n   ' None

False _Comment <built-in function Comment> 'Comment 2' '\n   blah blah\n'

Комментарии: не работает с xml.etree.cElementTree

6 голосов
/ 14 января 2010
>>> from lxml import etree
>>> tree = etree.parse('filename.xml')
>>> root = tree.getroot()
>>> print root.getprevious()
<!--Comment 1-->

Или чтобы быть уверенным (их может быть больше одного):

>>> for i in root.itersiblings(tag=etree.Comment, preceding=True):
...     print i
...
<!--Comment 1-->

Используйте атрибут .text, если вы хотите извлечь текст комментария.

...