40

ページに<div class="class1">とがある<p class="class1">場合は、soup.findAll(True, 'class1')両方が見つかります。

<p class="class1 class2">ただし、ある場合は見つかりません。他のクラスがあるかどうかに関係なく、特定のクラスを持つすべてのオブジェクトを見つけるにはどうすればよいですか?

4

4 に答える 4

34

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

これは機能します:

soup.findAll(True, {'class': re.compile(r'\bclass1\b')})
于 2009-08-07T03:49:51.823 に答える
19

誰かがこの質問に出くわした場合に備えて。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 と入力する必要はありません。

于 2013-08-25T01:28:49.407 に答える
11

lxmlを使用する必要があります。スペースで区切られた複数のクラス値 (「class1 class2」) で機能します。

その名前にもかかわらず、lxml は HTML の解析とスクレイピングにも使用されます。BeautifulSoup よりはるかに高速で、"壊れた" HTML を BeautifulSoup よりもうまく処理できます (彼らの名声)。lxml API を学習したくない場合は、BeautifulSoup 用の互換 API もあります。

Ian Bicking は同意し、BeautifulSoup よりも lxml を好みます。

Google App Engine を使用している場合や、純粋な Python 以外が許可されていない場合を除き、BeautifulSoup を使用する理由はもうありません。

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

于 2009-08-07T15:18:07.263 に答える
2

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

お気に入り:

soup.find_all("a", class_="class1")
于 2015-02-03T04:06:15.907 に答える