私はBeautifulSoupを使用してレンダリングされたコンテンツを取得することを完全に尊重していますが、ページ上のレンダリングされたコンテンツを取得するための理想的なパッケージではない場合があります。
レンダリングされたコンテンツ、または一般的なブラウザで表示されるコンテンツを取得する場合にも、同様の問題が発生しました。特に、以下のような単純な例で作業するために、おそらく非定型のケースがたくさんありました。この場合、表示できないタグはスタイルタグにネストされており、チェックした多くのブラウザでは表示されません。クラスタグ設定の表示をnoneに定義するなど、他のバリエーションもあります。次に、このクラスをdivに使用します。
<html>
<title> Title here</title>
<body>
lots of text here <p> <br>
<h1> even headings </h1>
<style type="text/css">
<div > this will not be visible </div>
</style>
</body>
</html>
上記の解決策の1つは次のとおりです。
html = Utilities.ReadFile('simple.html')
soup = BeautifulSoup.BeautifulSoup(html)
texts = soup.findAll(text=True)
visible_texts = filter(visible, texts)
print(visible_texts)
[u'\n', u'\n', u'\n\n lots of text here ', u' ', u'\n', u' even headings ', u'\n', u' this will not be visible ', u'\n', u'\n']
このソリューションには確かに多くの場合アプリケーションがあり、一般的には非常にうまく機能しますが、上記のhtmlでは、レンダリングされていないテキストが保持されます。SOを検索した後、いくつかの解決策がここに現れました。BeautifulSoupget_textはすべてのタグとJavaScript を削除しません。ここでは、Pythonを使用してHTMLをプレーンテキストにレンダリングします。
html2textとnltk.clean_htmlの両方のソリューションを試しましたが、タイミングの結果に驚いたので、後世のための答えが必要だと思いました。もちろん、速度はデータの内容に大きく依存します...
@Helgeからのここでの1つの答えは、すべてのもののnltkを使用することについてでした。
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
レンダリングされたhtmlで文字列を返すことは本当にうまくいきました。このnltkモジュールは、html2textよりも高速でしたが、おそらくhtml2textの方が堅牢です。
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop