2013-02-19 45 views
0

我最近在玩Beautifulsoup时遇到了一个奇怪的python字典问题。我的代码看起来像这样。dict.has_key(somekey)不能像dict中的somekey一样工作

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'不同。

任何人都可以解释非常感谢!

+2

您的'if'表达式并未按照您的想法进行操作。你可能想要添加一些括号,现在在a)中它被读为'not((a.has_key('href')=='href'))。 – 2013-02-19 11:15:38

回答

4

你可能想:

if not a.has_key('href'): 

或检查这得多的Python化的方式:

if 'href' not in a: 

has_key()作品像in关键字(如其他的答案中指出,你忘了括号),但has_key()deprecated,在Python 3.x中不支持。所以你应该总是使用in

+0

我认为这应该是'如果'href'不在',是最易读的 – 2013-02-19 11:15:58

+0

谢谢你是对的,虽然两者都是正确的。 – Nicolas 2013-02-19 11:19:17

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

+0

感谢您指出优先问题。我在原始代码中有这些括号,并在发布代码时将其删除。即使我把括号放回去,问题仍然存在。 has_key()的工作方式不同于。我最终发现问题并发现'a'变量不是类型dict,而是类BeautifulSoup.Tag。该类实现了一个名为has_key()的方法。在检查它的类型之前,我错误地认为这是一个字典。所以has_key()的作品,但关键字不。 – foresightyj 2013-02-20 01:16:11

+1

哦,猜猜鸭子打字有时会咬你:D – kunev 2013-02-20 08:23:13

相关问题