1

ウェブページからすべてのリンクを取得するために、Python 3.3 で Beautifulsoup4 と Soupstrainer を使用しています。以下は、重要なコード スニペットです。

r = requests.get(adress, headers=headers)
for link in BeautifulSoup(r.text, parse_only=SoupStrainer('a')):
    if hasattr(link, 'href'):

いくつかのWebページをテストしましたが、非常にうまく機能しますが、今日使用すると

adress = 'http://www.goldentigercasino.de/'

Goldentigercasino.de の例のように、「href」フィールドがない場合でも、hasattr(link, 'href') は常に TRUE を返すことがわかりました。そのため、link ['href'] を使用するのが遅くなったため、単にそこにないため、トラブルが発生しています。

また、次のような回避策も試しました。

test = requests.get('http://www.goldentigercasino.de/')
for link in BeautifulSoup(test.text, parse_only=SoupStrainer('a',{'href': not None})):

Doctypeも返すことを除いて、それは望みどおりに機能します:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"

上記と同じ理由で、これも問題を引き起こしています。

私の質問: hasattr が常に true を返すのはなぜですか?どうすれば修正できますか? また、hasattr で可能性がない場合、DOCTYPE を返さない回避策をどのように修正できますか?

これからもよろしくお願いします!

4

1 に答える 1

4

hasattr()間違ったテストです。属性があるかどうかをテストしa.href、BeautifulSoup は動的に属性を子の検索に変換します。HTML タグの属性は、Python の属性に変換されません。

代わりに辞書スタイルのテストを使用してください。インスタンスを含めることができるすべての要素をループするため、属性を持たないオブジェクトで中断しないように使用します。DocTypegetattr()

if 'href' in getattr(link, 'attrs', {}):

また、キーワード引数フィルターとして使用することで、属性を持つタグSoupStrainerのみを一致させるように指示することもできます(いずれにせよ):ahrefhref=Truenot NoneTrue

for link in BeautifulSoup(test.text, parse_only=SoupStrainer('a', href=True)):

もちろん、これにはまだ HTML 宣言が含まれています。aリンクのみを検索:

soup = BeautifulSoup(test.text, parse_only=SoupStrainer('a', href=True))
for link in soup.find_all('a'):
    print link
于 2013-07-30T10:06:44.660 に答える