lxml,序列化时缺少doctype

时间:2010-10-12 16:12:52

标签: python lxml doctype

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())

正确解析其doctype:

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>'

我该怎么做才能将该doctype序列化?

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

2 个答案:

答案 0 :(得分:2)

到目前为止,我能够让它工作的唯一方法是使用默认的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 :(得分:1)

Bug,如对另一个答案的评论中所述:missing doctype when serialized。 2015年2月修复将在lxml版本3.5中发布。