Параметр pretty_print в tostring не работает в lxml

Я пытаюсь использовать метод tostring в XML, чтобы получить "красивую" версию моего XML в виде строки. Пример на сайте lxml показывает этот пример:

>>> import lxml.etree as etree
>>> root = etree.Element("root")
>>> print(root.tag)
root
>>> root.append( etree.Element("child1") )
>>> child2 = etree.SubElement(root, "child2")
>>> child3 = etree.SubElement(root, "child3")
>>> print(etree.tostring(root, pretty_print=True))
<root>
  <child1/>
  <child2/>
  <child3/>
</root>

Однако мой вывод, запускающий эти точные строки:

b'<root>\n  <child1/>\n  <child2/>\n  <child3/>\n</root>\n'

Есть ли ошибка в версии lxml, которую я установил? Кажется странным, что дословный пример из учебника не работает.


person lanteau    schedule 28.03.2014    source источник


Ответы (1)


флаг b перед строкой показывает, что это байтовая строка. Чтобы напечатать это как строку юникода (что является типичной кодировкой для строки Python), вы можете сделать:

print(etree.tostring(root,pretty_print=True).decode())

или etree.tostring имеет флаг, позволяющий установить кодировку, поэтому:

print(etree.tostring(root,pretty_print=True,encoding='unicode'))

Любой способ работает для меня. Вот дополнительная информация о байтовых строках и Строки

person Adam Smith    schedule 28.03.2014
comment
Интересно, у меня тоже работает. Это просто ошибка в их документации? Изменилось ли что-то в python, чтобы сделать необходимым указание кодировки, когда этого не было раньше? - person lanteau; 28.03.2014
comment
@lanteau Честно говоря, я не знаю. Я не так часто использую lxml, но в другом разделе документов lxml показано, как etree.tostring возвращает объект bytes при задании флага method='text', так что, возможно, это было установлено по умолчанию в более новой версии lxml? - person Adam Smith; 28.03.2014
comment
Это не исправлено в последней версии, доступной на pip, lxml==3.5.0. - person Harald Nordgren; 27.01.2017