使用html5lib将任何HTML解析为XML

1 投票
1 回答
1348 浏览
提问于 2025-05-01 08:10

我需要整理一下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>

撰写回答