2017-11-24 16 views
1

一般的なページ構造を持たない2000個のWebサイトからプレーンテキストをクロールする必要があり、おそらく1つのスクリプトではクロールすることが難しいと思われます。BeautifulSoup - 特定のdivクラスにある場合、タグをクロールしない

「初めてのクローラ」では、BeautifulSoupでいくつかの試行錯誤を繰り返しました。現在、私は次のように特定のタグ(< P>と、すべての見出しタグ)との間でコンテンツを見ることで、いくつかのプレーンテキストをクロールするために管理:

soup.findAll(['p', re.compile('h[0-9]'), 'title']) 

はしかし、時にはいくつかのRSS /ニュースフィードがあります、そこから私はテキストを持っていないようにしてください。私はページのソースコードで見たものから、CSS divクラスに囲まれています。だから私の質問は、上記のコマンドは、特定のdivクラスに囲まれている場合、テキストをクロールしないように指示することができます。

答えて

1

あなたは、フィルタとしての機能を使用することができます。

`def my_filter(tag): 
return (tag.name == 'p' or re.compile('h[0-9]').match(tag.name) or tag.name== 'title') and (tag.parent['class'] != 'certain_div_class' or not tag.parent.has_attr('class')) 

my_tags = soup.findAll(my_filter)` 
+0

残念ながら、このコードは、何らかの理由で機能していません。 '(tag.parent ['class']!= 'certain_div_class'かどうかtag.parent.has_attr( 'class')' しかし、それでもコピー&ペーストすると、この部分を削除すると、出力が得られず、上からコードを取得できます。コードで見出しのタグで囲まれたテキストが除外されていないと思います。確かに... – TheDude

+0

私はその長い表現の閉じ括弧を忘れてしまいました。申し訳ありません。コードを編集しました。 'certain_div_class'を適切なクラス名に変更することを忘れないでください。 –

+0

ブラケットについては問題ありませんが、実際の問題はあなたのアプローチではうまくいかない正規表現です。見出しタグをハード・タイプにすると、つまり 'h1'を入力すると、私は前回出力した出力を得ます。 「h1」や「h2」などと入力しなくても、どうやってうまくやっていくことができるか考えてもらえますか? – TheDude

関連する問題