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'
どうすればこのエラーを取り除くことができますか?
BS3を使って、与えられたクラスのdivを見つけるためだけに検索を絞り込むことができます。
mydivs = soup.findAll("div", {"class": "stylelistrow"})
ドキュメントから:
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")
更新:2016最新バージョンのbeautifulsoupでは、メソッド 'findAll'は 'find_all'に改名されました。 公式文書へのリンク
それ故に答えはなるでしょう
soup.find_all("html_element", class_="your_class_name")
簡単な方法は次のとおりです。
soup = BeautifulSoup(sdata)
for each_div in soup.findAll('div',{'class':'stylelist'}):
print each_div
findAll の大文字/小文字の区別を忘れずに、 findall を使用してください。
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">
クラスごとに要素を見つける方法
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
に名前が変更されました。
次のように、divに最初にクラス属性があるかどうかを確認してください。
soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs:
if "class" in div:
if (div["class"]=="stylelistrow"):
print div
これは私がclass属性にアクセスするのに役立ちます(ドキュメンテーションが言っていることに反して、beautifulsoup 4では)。 KeyErrorは辞書ではなく返されるリストです。
for hit in soup.findAll(name='span'):
print hit.contents[1]['class']
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')
これは私のために働いた:
for div in mydivs:
try:
clazz = div["class"]
except KeyError:
clazz = ""
if (clazz == "stylelistrow"):
print div
次は私のために働いた
a_tag = soup.find_all("div",class_='full tabpublist')
これはうまくいくはずです。
soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs:
if (div.find(class_ == "stylelistrow"):
print div
BeautifulSoup 4以降、
単一のクラス名がある場合は、クラス名をパラメータとして渡すことができます。
mydivs = soup.find_all('div', 'class_name')
あるいは、複数のクラス名がある場合は、クラス名のリストをパラメータとして渡すだけです。
mydivs = soup.find_all('div', ['class1', 'class2'])