web-dev-qa-db-ja.com

BeautifulSoupの属性をチェックしていますか?

NextSiblingを使用して特定のレベルの要素をウォークスルーし、検出された各要素のタグ名とクラスに応じて異なる処理を実行することにより、HTMLからいくつかのデータを解析しています。

例えば。、

if n.name == "p" and n.class == "poem": blah()

ただし、要素にクラスがない場合、または要素がTagのインスタンスではないために名前がない場合、これによりエラーが発生します。

このようにアクセスする前にテストする

if "name" in n:

常にfalseを返します。 nextSiblingによって返されるオブジェクトのタイプをチェックして、NavigableStringとCommentを削除しようとすることはできますが、もっと簡単な方法が必要です。

編集

この質問をBeautifulSoupの開発者にメールで送信し、彼は

n.get("class")

「class」が設定されていない場合はNoneを返します。これにより、次のことが可能になります。

if n.get("class") == "poem": blah()
14
blocks

get()メソッドの使用に加えて

_n.get("class")
_

別のオプションは、has_attr()を使用することです(BeautifulSoup4より前にhas_key()を使用):

_n.has_attr("class")
_
15

この場合、例外はあなたの友人かもしれません:

try:
    if n.name == 'p' and n['class'] == "poem":
        blah()
except AttributeError: # element does not have .name attribute
    do_something()
except KeyError: # element does not have a class
    do_something_else()

次の場合は、1つのexceptにラップすることもできます。

try:
    if n.name == 'p' and n['class'] == "poem":
        blah()
except (AttributeError, KeyError):
    pass
6

これを試してください〜:

if class in n.attrs

1
CDT