web-dev-qa-db-ja.com

クラスごとに要素を見つける方法

Beautifulsoupを使用して、 "class"属性を持つHTML要素を解析できません。コードはこんな感じです

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div["class"] == "stylelistrow"):
        print div

スクリプトの終了後、同じ行にエラーが表示されます。

File "./beautifulcoding.py", line 130, in getlanguage
  if (div["class"] == "stylelistrow"):
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup.py", line 599, in __getitem__
   return self._getAttrMap()[key]
KeyError: 'class'

どうすればこのエラーを取り除くことができますか?

305
Neo

BS3を使って、与えられたクラスのdivを見つけるためだけに検索を絞り込むことができます。

mydivs = soup.findAll("div", {"class": "stylelistrow"})
497

ドキュメントから:

Beautiful Soup 4.1.2以降、キーワード引数class_を使用してCSSクラスで検索できます。

soup.find_all("a", class_="sister")

この場合はどれでしょう:

soup.find_all("div", class_="stylelistrow")

それはまた働くでしょう:

soup.find_all("div", class_="stylelistrowone stylelistrowtwo")
205
jmunsch

更新:2016最新バージョンのbeautifulsoupでは、メソッド 'findAll'は 'find_all'に改名されました。 公式文書へのリンク

List of method names changed

それ故に答えはなるでしょう

soup.find_all("html_element", class_="your_class_name")
41
overlord

簡単な方法は次のとおりです。

soup = BeautifulSoup(sdata)
for each_div in soup.findAll('div',{'class':'stylelist'}):
    print each_div

findAll の大文字/小文字の区別を忘れずに、 findall を使用してください。

15
Konark Modi

BeautifulSoup 3特有のもの:

soup.findAll('div',
             {'class': lambda x: x 
                       and 'stylelistrow' in x.split()
             }
            )

これらのすべてを見つけるでしょう:

<div class="stylelistrow">
<div class="stylelistrow button">
<div class="button stylelistrow">
14
FlipMcF

クラスごとに要素を見つける方法

Beautifulsoupを使用して "class"属性を持つHTML要素を解析できません。

1つのクラスで簡単に見つけることができますが、2つのクラスの交差点で見つけたい場合は、もう少し困難です。

ドキュメンテーション から(強調を追加):

が2つ以上の CSSクラスに一致するタグを検索する場合は、CSSセレクタを使用する必要があります。

css_soup.select("p.strikeout.body")
# [<p class="body strikeout"></p>]

明確にするために、これは取り消し線とボディクラスの両方であるpタグだけを選択します。

一連のクラス内のanyの共通部分(共通部分ではなく、共用体)を見つけるために、キーワード引数class_にリストを渡すことができます(4.1.2以降)。

soup = BeautifulSoup(sdata)
class_list = ["stylelistrow"] # can add any other classes to this list.
# will find any divs with any names in class_list:
mydivs = soup.find_all('div', class_=class_list) 

FindAllはcamelCaseからPythonicのfind_allに名前が変更されました。

8
Aaron Hall

次のように、divに最初にクラス属性があるかどうかを確認してください。

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs:
    if "class" in div:
        if (div["class"]=="stylelistrow"):
            print div
4
Mew

これは私がclass属性にアクセスするのに役立ちます(ドキュメンテーションが言っていることに反して、beautifulsoup 4では)。 KeyErrorは辞書ではなく返されるリストです。

for hit in soup.findAll(name='span'):
    print hit.contents[1]['class']
3
Stgltz

CSSセレクター

シングルクラスの最初の試合

soup.select_one('.stylelistrow')

一致のリスト

soup.select('.stylelistrow')

複合クラス(つまりAND他のクラス)

soup.select_one('.stylelistrow.otherclassname')
soup.select('.stylelistrow.otherclassname')

複合クラス名のスペースclass = stylelistrow otherclassnameは "。"に置き換えられます。クラスを追加し続けることができます。

クラスのリスト(OR - 存在するいずれかと一致する

soup.select_one('.stylelistrow, .otherclassname')
soup.select('.stylelistrow, .otherclassname')
2
QHarr

これは私のために働いた:

for div in mydivs:
    try:
        clazz = div["class"]
    except KeyError:
        clazz = ""
    if (clazz == "stylelistrow"):
        print div
1
Larry Symms

次は私のために働いた

a_tag = soup.find_all("div",class_='full tabpublist')
1
Preetham D P

これはうまくいくはずです。

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div.find(class_ == "stylelistrow"):
        print div
0
Blue Sky

BeautifulSoup 4以降、

単一のクラス名がある場合は、クラス名をパラメータとして渡すことができます。

mydivs = soup.find_all('div', 'class_name')

あるいは、複数のクラス名がある場合は、クラス名のリストをパラメータとして渡すだけです。

mydivs = soup.find_all('div', ['class1', 'class2'])
0
Shivam Shah