我想知道BeautifulSoup中attrMap
和attrs
之间的区别是什么?更具体地说,哪些代码具有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
答案 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)
将做正确的事情。