python - 使用 html5lib 将任何 HTML 解析为 XML

标签 python xml html5lib

我需要整理 HTML 页面并用 Python 将它们转换为 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> 的结束标签/斜杠标签,使它们只是 <link ... >输出 XML 时。

您建议使用什么?

最佳答案

您可以使用方法将元素设置为自关闭或不自关闭,如下所示:

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

然后就可以做你想做的事了。 当您尝试从元素写入时,您还可以添加方法:

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>

关于python - 使用 html5lib 将任何 HTML 解析为 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26717379/

相关文章:

Python Pandas 识别随时间的变化

python - 如何在 Pandas 数据框中将两列合并为一列

html - 在 xsl :apply-templates tag 中正确使用 xpath 的 "select="属性

python - Mechanize 选择第一个表单返回 "ImportError: No module named html5lib"

python - python 中的 grep -r

python - Python 中的属性桶

Java Xpath 表达式

java - 如何使用jaxb获取anyType值?

python - BeautifulSoup:从叶到根搜索首先获取 "deepest"元素?