Странное поведение с lxml getiterator () - PullRequest
0 голосов
/ 12 августа 2010

У меня есть следующий XML-документ:

<x>
  <a>Some text</c>
  <b>Some text 2</b>
  <c>Some text 3</c>
</x>

Я хочу получить текст всех тегов, поэтому я решил использовать getiterator().

Моя проблема в том, чтодобавляет пустые строки по причине, которую я не могу понять.Учтите это:

>>> for text in document_root.getiterator():
...     print text.text
... 


Some text
Some text 2
Some text 3

Обратите внимание на две лишние пустые строки перед «Некоторым текстом».Что является причиной этого?Если я передам тег методу getiterator(), то пустых строк не будет, как и должно быть.

>>> for text in document_root.getiterator('a'):
...     print text.text
... 
Some text

Итак, мой вопрос: что вызывает эти лишние пустые строки в случае, если я передам getiterator() без тега и как их удалить?

Ответы [ 2 ]

2 голосов
/ 12 августа 2010

По умолчанию lxml.etree будет рассматривать пустой текст между тегами как текстовое содержимое для этого тега, и в вашем случае отображаемый пробел происходит от <x>.Если вам нужен синтаксический анализатор, который игнорирует пробелы, вам нужно сделать что-то вроде:

from lxml import etree

parser = etree.XMLParser(remove_blank_text=True)

tree = etree.XML("""\
    <x>
      <a>Some text</a>
      <b>Some text 2</b>
      <c>Some text 3</c>
    </x>
""", parser)

for node in tree.iter():
    if node.text == None: continue
    print node.text

Обратите внимание, как node.text вернет None, если текста вообще нет.Также обратите внимание, что в документации API для lxml говорится, что getiterator() устарела в пользу iter().

Для получения дополнительной информации см. Учебник lxml.etree: объекты Parser .

0 голосов
/ 12 августа 2010

Хотя я не уверен, я бы предположил, что он пытается прочитать текст в .

Во всяком случае, что не так с

for text in document_root.getiterator():
    if text.strip() == '': continue
    print text
...