我想知道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
最佳答案
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
正如Adam所指出的,这是因为
__contains__
上的Tag
方法搜索的是内容,而不是属性,所以更熟悉的key in tag
并没有达到预期的效果。这种复杂性的产生是因为漂亮的Trand处理具有重复属性的HTML标记。所以一个普通的地图(字典)是不够的,因为钥匙可以重复。但是如果您想检查是否有任何具有给定名称的密钥,那么key in dict(tag.attrs)
将做正确的事情。