使用Python将HTML呈现为纯文本

2024-05-13 20:47:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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)

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


Tags: text文本divhtmlmoreanothersomeli
2条回答

我在尝试解析呈现的HTML时遇到了同样的问题。基本上看来BS并不是这方面的理想包。@Del提供了伟大的html2text解决方案。

关于一个不同的问题: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

BeautifulSoup是一个scraping库,因此它可能不是进行HTML渲染的最佳选择。如果没有必要使用BeautifulSoup,您应该看看^{}。例如:

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

相关问题 更多 >