ホームページ >バックエンド開発 >Python チュートリアル >Pythonテキストコンテンツの抽出
通常、Web ページを開くと、記事の本文に加えて、ナビゲーション、広告、その他の情報がたくさん表示されます。このブログの目的は、Web ページから記事のテキスト コンテンツを抽出し、他の無関係な情報を移動する方法を説明することです。
この方法はテキスト密度に基づいています。元のアイデアはハルビン工業大学の「General Web Page Text Extraction Algorithm Based on Line Block Distribution Function」に基づいています。この記事はこれに基づいて若干の修正を加えています。
規約:
この記事は、Web ページのさまざまな行に基づいて統計を作成します。 したがって、Web ページのコンテンツが圧縮されていないと仮定すると、Web ページには通常の改行があることを意味します。 comedニュースのテキストコンテンツは比較的短いかもしれませんが、ビデオにはより高い重みがあります重さは画像の通りに表示されるはずですが、この記事の方法ではそれが実現できません。これらの広告、ナビゲーションのため、これらの作成されていないコンテンツは通常、ハイパーリンクの形式で表示されるため、テキストのテキストにはハイパーリンクのテキストの重みがゼロに設定されます。
ここでは、テキストの内容が連続しており、テキスト以外の内容が含まれていないと仮定しています。したがって、実際には、テキストの内容を抽出することは、テキストの内容の始まりと終わりを見つけることになります。
手順:
まず、Web ページ内の CSS、JavaScript、コメント、Meta、Ins タグの内容をクリアし、空白行をクリアします。
各行の処理値を計算します (1)
上記で取得した各行のテキスト数の最大の正の部分文字列の開始位置と終了位置を計算します
2 番目のステップについて説明する必要があります
、値を計算する必要があります。この値の計算は次のとおりです:
50 文字の長さのテキスト (指定された重み) に相当する画像タグ IMG、x1、
ビデオ タグ EMBED、これは、1000〜1000文字のテキストの外観長、x2
’2の発生 + x4 - 8
//説明に相当します。この数字がどれくらいであるべきかについては、経験に基づいていると思います。
完全なコード
#coding:utf-8 import re def remove_js_css (content): """ remove the the javascript and the stylesheet and the comment content (<script>....</script> and <style>....</style> <!-- xxx -->) """ r = re.compile(r'''<script.*?</script>''',re.I|re.M|re.S) s = r.sub ('',content) r = re.compile(r'''<style.*?</style>''',re.I|re.M|re.S) s = r.sub ('', s) r = re.compile(r'''<!--.*?-->''', re.I|re.M|re.S) s = r.sub('',s) r = re.compile(r'''<meta.*?>''', re.I|re.M|re.S) s = r.sub('',s) r = re.compile(r'''<ins.*?</ins>''', re.I|re.M|re.S) s = r.sub('',s) return s def remove_empty_line (content): """remove multi space """ r = re.compile(r'''^\s+$''', re.M|re.S) s = r.sub ('', content) r = re.compile(r'''\n+''',re.M|re.S) s = r.sub('\n',s) return s def remove_any_tag (s): s = re.sub(r'''<[^>]+>''','',s) return s.strip() def remove_any_tag_but_a (s): text = re.findall (r'''<a[^r][^>]*>(.*?)</a>''',s,re.I|re.S|re.S) text_b = remove_any_tag (s) return len(''.join(text)),len(text_b) def remove_image (s,n=50): image = 'a' * n r = re.compile (r'''<img.*?>''',re.I|re.M|re.S) s = r.sub(image,s) return s def remove_video (s,n=1000): video = 'a' * n r = re.compile (r'''<embed.*?>''',re.I|re.M|re.S) s = r.sub(video,s) return s def sum_max (values): cur_max = values[0] glo_max = -999999 left,right = 0,0 for index,value in enumerate (values): cur_max += value if (cur_max > glo_max) : glo_max = cur_max right = index elif (cur_max < 0): cur_max = 0 for i in range(right, -1, -1): glo_max -= values[i] if abs(glo_max < 0.00001): left = i break return left,right+1 def method_1 (content, k=1): if not content: return None,None,None,None tmp = content.split('\n') group_value = [] for i in range(0,len(tmp),k): group = '\n'.join(tmp[i:i+k]) group = remove_image (group) group = remove_video (group) text_a,text_b= remove_any_tag_but_a (group) temp = (text_b - text_a) - 8 group_value.append (temp) left,right = sum_max (group_value) return left,right, len('\n'.join(tmp[:left])), len ('\n'.join(tmp[:right])) def extract (content): content = remove_empty_line(remove_js_css(content)) left,right,x,y = method_1 (content) return '\n'.join(content.split('\n')[left:right])
コードは最後の関数から呼び出されます。