2012-12-10 9 views
5

私は美しいスープを使って特定のdivタグを取り出していますが、それは私が 単純な文字列のマッチングを使うことができないようです。美味しいスープのためのPython正規表現

ページは、Xが任意の長さの整数を表し

<div class="comment comment-xxxx..."> 

の形で私は無視する

<div class="comment form new"...> 

の形でいくつかのタグ、および、いくつかのタグを有しています、楕円は空白で区切られた任意の数の他の値を表します(私が気にしていないもの)。私は 正しい正規表現を理解することはできません。特にPythonのreクラスを使ったことがないからです。

soup.find_all(class_="comment") 

を使用して

はワードコメントで始まるすべてのタグを検索します。私は

soup.find_all(class_=re.compile(r'(comment)()(comment)')) 
soup.find_all(class_=re.compile(r'comment comment.*')) 

や他のバリエーションの多くを使用して試してみましたが、私はどのように正規表現式またはマッチ()の仕事について、ここで何かを明らかに不足していると思います。誰か助けてくれますか?

+1

まず、BS3、BS4を使用していますか? 1つは 'findAll'、1つは' find_all'、 'findall'はありません... – abarnert

+0

申し訳ありません、BS4 - 自分のコードから直接貼り付けて編集しませんでした。 – user1890572

+0

BS3の答えがあったからね。でも、BS4の場合、クラスのスペースがあまり好きではないようですね。あるいは、私はBS4をよく知っていないかもしれません。私は ''コメント ''とマッチすることはできますが、 ''コメントのコメント ''ではマッチできません。私はそれを調べます。 – abarnert

答えて

15

私はそれを持っていると思う:

['comment form new', 'comment comment-xxxx...'] 

そして、あなたの正規表現が一致しません理由です:BS3で同等とは異なり、それはこれではない、ということ

>>> [div['class'] for div in soup.find_all('div')] 
[['comment', 'form', 'new'], ['comment', 'comment-xxxx...']] 

は注意してください。例えば

しかし、あなたが一致することができ、この:あなたが'comment-.*'を必要としないので、BSは、re.search、ないre.matchの同等を行うこと

>>> soup.find_all('div', class_=re.compile('comment-')) 
[<div class="comment comment-xxxx..."></div>] 

注意。もちろん、'comment-12345'と一致させたい場合は'comment-of-another-kindでない場合は、たとえば'comment-\d+'とします。

+0

私はこのことについてBS4の文書で覚えていますが、それはまだ直観に反しています。どうもありがとう!私はこれに対して1時間+私の頭を打つ。 – user1890572

+0

@ user1890572:理由はわかりませんが、私はまだBS3から移行した第三者「BS3からの移行」ガイドを超えてBS4のドキュメントを読んでいないので、このような問題を自分で混乱させることに慣れてきましたコード。私がもっと賢いとすれば、私は答えることができませんでした。 :) – abarnert