使用Python将HTML呈现为纯文本

问题描述 投票:34回答:2

我正在尝试使用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元素总是在新的一行上。这当然是一个简单的例子。有没有办法让HTML页面中的文本在浏览器中呈现的方式(不需要css规则,只有常规的div,span,li等元素呈现)?

python beautifulsoup
2个回答
82
投票

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

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

这输出:

Some text more text even more text

  * list item
  * yet another list item

Some other text

  * list item
  * yet another list item

4
投票

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

在一个不同的SO问题上:qazxsw poi @Helge提到使用nltk。不幸的是,nltk似乎正在停止这种方法。

我尝试了html2text和nltk.clean_html,并对计时结果感到惊讶,所以认为他们应该为子孙后代做出回答。当然,速度很大程度上取决于数据的内容......

来自@Helge(nltk)的回答。

BeautifulSoup get_text does not strip all tags and JavaScript

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

上面的答案来自@del

import nltk

%timeit nltk.clean_html(html)
was returning 153 us per loop
© www.soinside.com 2019 - 2024. All rights reserved.