使用 Python 将 HTML 渲染为纯文本

Posted

技术标签:

【中文标题】使用 Python 将 HTML 渲染为纯文本【英文标题】:Rendered HTML to plain text using Python 【发布时间】:2012-10-31 12:16:41 【问题描述】:

我正在尝试使用 BeautifulSoup 转换一大段 html 文本。这是一个例子:

<div>
    <p>
        Some text
        <span>more text</span>
        even more text
    </p>
    <ul>
        <li>list item</li>
        <li>yet another list item</li>
    </ul>
</div>
<p>Some other text</p>
<ul>
    <li>list item</li>
    <li>yet another list item</li>
</ul>

我尝试做类似的事情:

def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)

...但是这样我的 span 元素总是在一个新的行上。这当然是一个简单的例子。有没有办法在 Python 中获取 HTML 页面中的文本,就像它在浏览器中呈现的方式一样(不需要 css 规则,只需常规方式 div、span、li 等元素呈现)?

【问题讨论】:

向我们展示预期的输出是什么样的?你想去掉所有的缩进空格和换行符,对吧? 【参考方案1】:

BeautifulSoup 是一个抓取库,因此它可能不是进行 HTML 渲染的最佳选择。如果不是必须使用 BeautifulSoup,你应该看看html2text。例如:

import html2text
html = open("foobar.html").read()
print html2text.html2text(html)

这个输出:

一些文字更多文字甚至更多文字 * 项目清单 * 另一个列表项 其他一些文字 * 项目清单 * 另一个列表项

【讨论】:

我可以将 html2text 与 BeautifulSoup 结合使用吗?例如,我解析我感兴趣的 html 块,然后使用 pretify() 将其提供给 html2text? 是的,html2text可以分块处理HTML,方法是在每个连续的块上调用HTML2Text.feed(chunk),然后调用HTML2Text.close()得到文本结果(类似于HTMLParser.feed())。 这个答案让我既高兴又悲伤。安息吧 Aaron Swartz。 记得检查 html2text 是否符合您的许可政策,因为它是根据 GPLv3 分发的。 html2text 将 html 字符串转换为 markdown 字符串。所以这个库可能不能满足每个人的需求,有些人可能不希望 Markdown 标签出现在结果中。比如我。【参考方案2】:

我在尝试解析呈现的 HTML 时遇到了同样的问题。基本上,BS 似乎不是这个理想的包。 @Del 提供了很棒的 html2text 解决方案。

关于一个不同的 SO 问题:BeautifulSoup get_text does not strip all tags and javascript@Helge 提到使用 nltk。不幸的是,nltk 似乎停止了这种方法。

我尝试了 html2text 和 nltk.clean_html 并且对时间结果感到惊讶,因此认为它们值得为后代提供答案。当然,速度很大程度上取决于数据的内容......

@Helge (nltk) 的回答。

import nltk

%timeit nltk.clean_html(html)
was returning 153 us per loop

返回带有渲染 html 的字符串非常有效。这个 nltk 模块甚至比 html2text 更快,尽管 html2text 可能更健壮。

以上来自@del的回答

betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop

【讨论】:

nltk.clean_html 给出NotImplementedError: To remove HTML markup, use BeautifulSoup's get_text() function 即使你碰巧有旧版本的nltk,也不要使用这个功能。速度很快,因为它使用正则表达式处理 html:github.com/nltk/nltk/blob/… 我添加了一个相关问题的答案,它提供了一种通过 BeautifulSoup 剥离 JavaScript 的方法:***.com/a/47782943/2112722

以上是关于使用 Python 将 HTML 渲染为纯文本的主要内容,如果未能解决你的问题,请参考以下文章

使用 MIME::Entity 将 HTML 电子邮件转换为纯文本

如何使用正则表达式 html 将空白行删除为纯文本?

将 HTML 项目符号转换为纯文本

将 vue.js 获取的 html 文本转化为纯文本

将 HTML 代码转换为纯文本,格式可用于文本文件 [重复]

如何将 HTML 文本转换为纯文本? [复制]