比BeautifulSoup更快且资源占用更少的从大文件中提取HTML的方法?或者,更好的使用BeautifulSoup的方法?

5 投票
2 回答
1255 浏览
提问于 2025-04-16 10:31

我现在打字有点困难,因为根据 top 告诉我的信息,我的处理器使用率达到了100%,内存使用率也有85.7%,而这些都是被python占用了。

为什么会这样呢?因为我让它处理一个250兆的文件,目的是去掉里面的标记。250兆,就这么一点!我之前用python处理过很多这样的文件,使用了很多其他模块和工具;可是这次用BeautifulSoup处理这么小的文件却出现了问题。怎么会有将近4GB的内存用来处理250兆的html呢?

我在stackoverflow上找到的一个一行代码,一直在用,代码是:

''.join(BeautifulSoup(corpus).findAll(text=True))

另外,这段代码似乎去掉了所有内容,除了标记,这正好和我想做的相反。我相信BeautifulSoup也能做到这一点,但速度的问题依然存在。

有没有什么方法可以做到类似的事情(去掉标记,可靠地保留文本),而不需要用超级计算机来运行呢?

2 个回答

0

使用lxml.html中的清理工具:

>>> import lxml.html
>>> from lxml.html.clean import Cleaner
>>> cleaner = Cleaner(style=True) # to delete scripts styles objects comments etc;)
>>> html = lxml.html.fromstring(content).xpath('//body')[0]
>>> print cleaner.clean_html(html)
13

lxml.html 的效率要高得多。

http://lxml.de/lxmlhtml.html

在这里输入图片描述

http://blog.ianbicking.org/2008/03/30/python-html-parser-performance/

看起来这个可以满足你的需求。

import lxml.html
t = lxml.html.fromstring("...")
t.text_content()

还有几个类似的问题: python [lxml] - 清除 HTML 标签

lxml.etree,element.text 没有返回元素的全部文本

在 Python 中过滤掉 HTML 标签并解析实体

更新:

你可能想要清理 HTML,去掉所有的脚本和 CSS,然后使用 .text_content() 来提取文本。

from lxml import html
from lxml.html.clean import clean_html

tree = html.parse('http://www.example.com')
tree = clean_html(tree)

text = tree.getroot().text_content()

(来自: 在 Python 中移除所有 HTML?)

撰写回答