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关键字一样工作(正如其他答案指出的那样,您忘记了括号),但在 Python 3.x 中has_key()弃用且不受支持。因此,您应该始终使用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

此外,在 python3 中弃用 has_key 并且不支持它的事情。如果您有选择,请将 python2 全部转储并选择 3.x

于 2013-02-19T11:17:12.810 回答