0

私は最近、Beautifulsoupで遊んでいるときにPython辞書で奇妙な問題に遭遇しました。私のコードは次のようになります。

import urllib2
from BeautifulSoup import BeautifulSoup

response = urllib2.urlopen("http://www.msn.com")
html = response.read()
soup = BeautifulSoup(html)
anchors = soup.findAll('a')
for a in anchors:
    if not a.has_key('href') == 'href' in a:
        print a

実際には多くのリンクが出力され、has_keyは「in」とは異なる動作をします。

誰でも説明できますかありがとうございます!

4

2 に答える 2

4

あなたはおそらく欲しい:

if not a.has_key('href'):

または、これをチェックする非常に Pythonic な方法:

if 'href' not in a:

has_key()キーワードのように機能しinます(他の回答が指摘したように、括弧を忘れました)が、has_key()推奨であり、Python 3.x ではサポートされていません。したがって、常に使用する必要がありますin

于 2013-02-19T11:13:24.207 に答える
1

これは、演算子の優先順位から来ています。

>>> a = {'a': 5, 'b': 6}
>>> a.has_key('a')
True
>>> 'a' in a
True
>>> a.has_key('a') == 'a' in a
False
>>> a.has_key('a') == ('a' in a)
True
>>> (a.has_key('a') == 'a') in a
False

だからあなたの場合

if not a.has_key('href') == 'href' in a:
        print a

実際に意味する

if not (a.has_key('href') == 'href') in a:
        print a

チェックしたいときに

if not a.has_key('href') == ('href' in a):
        print a

さらに、has_key を廃止し、python3 でサポートしていないこと。選択肢がある場合は、python2 をまとめてダンプし、3.x に進みます。

于 2013-02-19T11:17:12.810 に答える