lxml, отсутствующий тип документа при сериализации - PullRequest
3 голосов
/ 12 октября 2010
In [1]: from lxml import etree

У меня есть HTML-документ:

In [2]: root = etree.fromstring(u'''<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">\n<HTML></HTML>''', etree.HTMLParser())

Его тип документа анализируется правильно:

In [3]: root.getroottree().docinfo.doctype
Out[3]: u'<!DOCTYPE html PUBLIC "-//IETF//DTD HTML//EN">'

Но при сериализации я теряю его:

In [4]: etree.tostring(root.getroottree(), method='html')
Out[4]: '<html></html>'

Что мне нужно сделать, чтобы сериализовать этот тип документа?

Debian GNU / Linux, Sid.Python 2.6.6.lxml 2.2.8-2.

Ответы [ 2 ]

2 голосов
/ 12 октября 2010

Единственный способ заставить его работать до сих пор - это использовать XML-анализатор по умолчанию и добавить в документ непустой системный URL:

>>> html = etree.parse(StringIO('''<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN" " ">\n<HTML></HTML>'''))
>>> etree.tostring(html, method="xml")
'<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN" " ">\n<HTML/>'
>>> etree.tostring(html, method="html")
'<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN" " ">\n<HTML></HTML>'

То же самое с использованием HTMLParser приводит к той же самой информации docinfo, но не к желаемому выводу:

>>> html = etree.parse(StringIO('''<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN" " ">\n<HTML></HTML>'''), etree.HTMLParser())
>>> etree.tostring(html, method="html")
'<html></html>'
1 голос
/ 11 июня 2011

Ошибка, как упомянуто в комментарии к другому ответу: Отсутствует тип документа при сериализации . Исправление в феврале 2015 года для версии 3.5 lxml.

...