代码之家  ›  专栏  ›  技术社区  ›  liori

LXML,序列化时缺少doctype

  •  3
  • liori  · 技术社区  · 14 年前
    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.LXML 2.2.8-2。

    2 回复  |  直到 9 年前
        1
  •  2
  •   bosmacs    14 年前

    到目前为止,我能让它工作的唯一方法是使用默认的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>'
    
        2
  •  1
  •   liori    9 年前

    错误,如对另一个答案的注释中所述: missing doctype when serialized . Fix于2015年2月发布,版本为3.5 lxml .