beautifulSoup中attrMap和attrs之间的区别

时间:2012-01-12 21:01:20

标签: python beautifulsoup

我想知道BeautifulSoupattrMapattrs之间的区别是什么?更具体地说,哪些代码具有attrs且哪些代码具有attrMap

>>> soup = BeautifulSoup.BeautifulSoup(source)
>>> tag = soup.find(name='input')
>>> dict(tag.attrs)['type']
u'text'
>>> tag.attrMap['type']
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable

1 个答案:

答案 0 :(得分:3)

attrMap字段是Tag类中的内部字段。您不应该在代码中使用它。你应该改为使用

value = tag[key]
tag[key] = value

此内部映射到tag.attrMap[key],但仅在__getitem____setitem__确保初始化self.attrMap之后。这是在_getAttrMap中完成的,这不是一个复杂的dict(self.attrs)调用。因此,对于您的代码,您将使用

>>> url = "http://stackoverflow.com/questions/8842224/"
>>> soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url).read())
>>> soup.find(name='input')
>>> tag = soup.find(name='input')
>>> tag['type']
u'text'

如果要检查给定属性是否存在,则必须使用

try:
    tag[key]
    # found key
except KeyError:
    # key not present

if key in dict(tag.attrs):
    # found key
else:
    # key not present

正如亚当指出的那样,这是因为__contains__上的Tag方法会搜索内容,而不是属性,所以更熟悉的key in tag不会做什么你会期待的。出现这种复杂性是因为BeautifulSoup处理具有重复属性的HTML标记。因此,正常的地图(字典)还不够,因为密钥可以复制。但是,如果您想检查是否存在具有给定名称的任何键,那么key in dict(tag.attrs)将做正确的事情。