有没有办法用 lxml 解析 html,但用 minidom 操作它?

发布于 2024-08-11 22:50:12 字数 371 浏览 2 评论 0原文

我有一个应用程序,我一直在使用 html5lib 来自由地解析 html。我使用 minidom 接口,因为我需要一个真正的 DOM API,而 ElementTree 不适合我正在做的事情。

我是这样做的:

parser = html5lib.XHTMLParser(tree=html5lib.treebuilders.getTreeBuilder('dom'))
parser.parse(html)

然而,解析大文件正在成为性能瓶颈,lxml 解析比 html5lib 快大约 80 倍(我对它进行了基准测试)。

如何使用 lxml 或类似的快速的坏 html 容忍库进行解析,并使用 DOM 兼容的 API 进行操作?

I have an application where I've been using html5lib to liberally parse html. I use the minidom interface, because I need a real DOM API and ElementTree is not appropriate for what I'm doing.

Here's how I do this:

parser = html5lib.XHTMLParser(tree=html5lib.treebuilders.getTreeBuilder('dom'))
parser.parse(html)

However, parsing huge files is becoming a performance bottleneck, and lxml parsing is about 80 times faster than html5lib (I benchmarked it).

How do I parse with lxml or a similarly fast bad-html-tolerant library, and manipulate with a DOM-compatible API?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

终弃我 2024-08-18 22:50:12

我想我找到了一个解决方案:

from xml.dom.pulldom import SAX2DOM
import lxml.sax
def parse_lxml_dom(html):
    tree = lxml.html.document_fromstring(html)
    handler = SAX2DOM()
    lxml.sax.saxify(tree, handler)
    return handler.document

但是,这仅比 html5lib 快大约 7 倍。 saxify 调用需要相当长的时间。

Think I found a solution:

from xml.dom.pulldom import SAX2DOM
import lxml.sax
def parse_lxml_dom(html):
    tree = lxml.html.document_fromstring(html)
    handler = SAX2DOM()
    lxml.sax.saxify(tree, handler)
    return handler.document

However, this is only about 7 times faster than html5lib. The saxify call takes quite a while.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文