使用 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 电子邮件转换为纯文本