2009-08-07 6 views
37

ページに<div class="class1"><p class="class1">がある場合は、soup.findAll(True, 'class1')の両方で検索されます。オブジェクトに他のクラスがある場合、Beautiful SoupはCSSクラスを見つけることができません。

<p class="class1 class2">がある場合、それは見つからないでしょう。特定のクラスを持つすべてのオブジェクトを、他のクラスを持っているかどうかに関係なく、どのように見つけることができますか?

+3

**更新**:これは伝え4ベータ5で修正されています: https://bugs.launchpad.net/beautifulsoup/+bug/410304 – endolith

答えて

15

誰かがこの質問に遭遇した場合に備えて。 BeautifulSoupはこれをサポートします:

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] 
Type "copyright", "credits" or "license" for more information. 

In [1]: import bs4 

In [2]: soup = bs4.BeautifulSoup('<div class="foo bar"></div>') 

In [3]: soup(attrs={'class': 'bar'}) 
Out[3]: [<div class="foo bar"></div>] 

また、findAllをもう入力する必要はありません。

34

残念ながら、BeautifulSoupはこれを2つのクラス['class1','class2']ではなく、'class1 class2'のスペースを持つクラスとして扱います。回避策は、正規表現を使用して文字列ではなくクラスを検索することです。

これは動作します:

soup.findAll(True, {'class': re.compile(r'\bclass1\b')}) 
+2

https://bugs.launchpad.net/bugs/410304 – endolith

+3

これは現在修正されているようです。 – Kugel

+1

@Kugel:別の答えを追加しますか? – endolith

10

あなたはlxmlを使用する必要があります。スペース( 'class1 class2')で区切られた複数のクラス値で動作します。

名前にもかかわらず、lxmlはHTMLの解析とスクレイピングにも使用されます。それは、BeautifulSoupよりはるかに高速で、BeautifulSoupよりも「壊れた」HTMLを扱っています(彼らの名声に対する彼らの主張)。 lxml APIを習得したくない場合は、BeautifulSoup用の互換APIもあります。

Ian Bicking agreesがあり、BeautifulSoupよりもlxmlを優先します。

Google App Engineや純粋にPython以外のものがない限り、BeautifulSoupを使用する理由はありません。

lxmlでCSSセレクタを使用することもできるので、BeautifulSoupよりもはるかに簡単です。インタラクティブなPythonコンソールで試してみてください。

+7

lxmlのドキュメントから: "libxml2(したがってlxml)も壊れたHTMLを解析できますが、BeautifulSoupはもう少し寛容であり、エンコーディングの検出をサポートしています。 – endolith

+0

私はそれを試してきましたが、実際にこの種のものの方がよかったです。 – endolith

+0

嬉しいです。あなたが言葉を広げてくれることを願って、lxmlは、評価の低い図書館です。私は名前に「XML」があり、そのドキュメントはBeautifulSoupほど美味しくないので、多く見落としていると思います。 BSには名前とグラフィックが付いているので、面白い理​​由でもう少し魅力的です。 – aehlke

2

特定のCSSクラスを持つタグを検索するのは非常に便利ですが、CSS属性の名前 "class"はPythonの予約語です。クラスをキーワード引数として使用すると、構文エラーが発生します。

同様::美しいスープ4.1.2の時点で、あなたはキーワード引数class_がを使用してCSSクラスで検索することができます

soup.find_all("a", class_="class1") 
+0

申し訳ありませんが、あなたの答えは間違っていると思います。 Beautiful Soupの文書(http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#Searching%20by%20CSS%20class)によれば、 'find_all'を使用してCSSクラス:クラス名をStringとして渡すか、キー "class"を持つdictを作成し、CSSクラスの名前を持つ値を作成します。 –

+0

私の答えを見てうれしいですが、bs3ではなくbs3を使用しています。多分インターフェイスが@ RodrigoTaboadaに変更されました –

+0

Beautiful Soup4 doc [link](http://www.crummy.com/software/BeautifulSoup/bs4/) doc /#searching-by-css-class) –

関連する問題