2010-10-12 27 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