55

私は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ページのテキストを取得する方法はありますか?

4

2 に答える 2

119

BeautifulSoupはスクレイピングライブラリであるため、HTMLレンダリングを行うための最良の選択ではない可能性があります。BeautifulSoupの使用が必須ではない場合は、をご覧くださいhtml2text。例えば:

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

これは以下を出力します:

いくつかのテキストより多くのテキストさらに多くのテキスト

  *リストアイテム
  *さらに別のリストアイテム

他のテキスト

  *リストアイテム
  *さらに別のリストアイテム
于 2012-11-12T03:09:46.810 に答える
5

レンダリングされたHTMLを解析しようとしても同じ問題が発生していました。基本的に、BSはこのための理想的なパッケージではないようです。@Delは素晴らしいhtml2textソリューションを提供します。

別のSOの質問について:BeautifulSoup get_textは、nltkを使用して言及されたすべてのタグとJavaScript @Helgeを削除しません 。残念ながら、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
于 2013-11-05T17:53:46.903 に答える