使用html5lib将任何HTML解析为XML
我需要整理一下HTML页面,并把它们转换成XML格式,必要时可以去掉一些“坏”的部分。
我之前用过TagSoup,但它不理解新的“article”和“footer”标签,而且当“meta”标签不在头部时,它也处理得不好;这样生成的XML几乎无法处理。
我对html5lib的表现还挺满意的,但在我的第五次测试(非常奇怪的测试)中失败了;在解析时
<div attr="val"">
使用html5lib加上xml.dom的树构建器,我得到的XML字符串是:
<div attr="val" "="">
这个结果对于格式正确的XML来说并不好。
当我尝试用html5lib加上lxml作为树构建器时,转换成了
<div attr="val" U00022="">
这个结果要好一些,但问题是lxml会“吃掉”<link>
标签的闭合标签和斜杠,输出的XML中只剩下<link ... >
。
你有什么推荐的工具吗?
1 个回答
2
你可以使用 method
来设置一个元素是否为自闭合元素,类似这样:
from lxml import etree
tree = etree.Element('div', attrib={'attr':'val', 'U00022':''})
etree.tostring(tree)
'<div U00022="" attr="val"/>'
# parse as self-closing tag
etree.tostring(tree, method='xml')
'<div U00022="" attr="val"/>'
# parse as normal HTML
etree.tostring(tree, method='html')
'<div U00022="" attr="val"></div>'
然后你可以随意对它进行操作。当你想从这个元素中写入内容时,也可以添加 method
:
tree = html5lib.parse('<div attr="val" U00022="">', treebuilder='lxml', namespaceHTMLElements=False)
tree.write('yourfilename', method='html')
输出结果:
<html><head></head><body><div u00022="" attr="val"></div></body></html>