2010-10-12 12 views
3
In [1]: from lxml import etree 

我有一个HTML文档丢失的文档类型:LXML,当系列化

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

我该怎么做才能得到那个doctyp e序列化?

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

+0

什么版本的lxml? – bosmacs 2010-10-12 16:25:01

+0

@bosmacs:编辑。 – liori 2010-10-12 16:30:46

回答

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产生相同的文档信息,但不期望的输出:

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

谢谢,但我的输入通常是无效的XML - 因此HTML解析器。我提出了一个错误:https://bugs.launchpad.net/lxml/+bug/659367 – liori 2010-10-12 19:37:30

+0

没问题,我想这可能是这样的。 – bosmacs 2010-10-12 19:41:20