python - 解析lxml中的html正文片段

标签 python html lxml lxml.html pyquery

我正在尝试解析 html 片段:

<body><h1>title</h1><img src=""></body>

我使用 lxml.html.fromstring .它让我发疯,因为它一直在剥离 <body>我的片段的标签:

 > lxml.html.fromstring('<html><h1>a</h1></html>').tag
 'html'
 > lxml.html.fromstring('<div><h1>a</h1></div>').tag
 'div'
 > lxml.html.fromstring('<body><h1>a</h1></body>').tag
 'h1'

我也试过 document_fromstring , fragment_fromstring , clean_htmlpage_structure=False等等...没有任何效果。

我需要使用 lxml,因为我要将 html 片段传递给 PyQuery。

我只是希望 lxml 不会弄乱我的 html 片段。有可能吗?

最佳答案

.fragment_fromstring()删除 <html>标签也是如此;基本上,只要您有 HTML 文档(带有 <html> 顶级元素和/或文档类型),.fromstring()回到 .fragment_fromstring()并且该方法同时删除了 <html><body>标签,总是。

解决方法是告诉.fragment_fromstring()给你一个<body> 父级标签:

>>> lxml.html.fragment_fromstring('<body><h1>a</h1></body>', create_parent='body')
<Element body at 0x10d06fbf0>

这不会保留原始 <body> 上的任何属性标签。

另一种解决方法是使用 .document_fromstring()方法,它将您的文档包装在 <html> 中标签,然后您可以再次将其删除:

>>> lxml.html.document_fromstring('<body><h1>a</h1></body>')[0]
<Element body at 0x10d06fcb0>

确实保留了 <body> 上的属性:

>>> lxml.html.document_fromstring('<body class="foo"><h1>a</h1></body>')[0].attrib
{'class': 'foo'}

使用 .document_fromstring()你的第一个例子的功能给出:

>>> body = lxml.html.document_fromstring('<body><h1>title</h1><img src=""></body>')[0]
>>> lxml.html.tostring(body)
'<body><h1>title</h1><img src=""></body>'

如果你只想在没有没有 HTML 标签的情况下执行此操作,请执行 lxml.html.fromstring()执行并测试完整文档:

htmltest = lxml.html._looks_like_full_html_bytes if isinstance(inputtext, str) else lxml.html._looks_like_full_html_unicode
if htmltest(inputtext):
    tree = lxml.html.fromstring(inputtext)
else:
    tree = lxml.html.document_fromstring(inputtext)[0]

关于python - 解析lxml中的html正文片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498805/

相关文章:

html - 导航栏下方的额外空间

javascript - 使用 service worker 缓存指向另一个页面的链接

python - lxml 的 iterparse 尝试将整个文件加载到内存中

python - 如何在没有 linux 管理权限的情况下为 python 安装 lxml?

python - Python字符串添加优化失败案例

python - Scipy 树状图叶节点排序

python - 向 Django 中长时间运行的方法发送信号

python - 从制表符分隔值文件中删除某些返回字符

html - 为什么我的字体大小不会相对于屏幕大小发生变化?

python - pip 无法正确安装软件包 : Permission denied error