我想知道BeautifulSoupattrMapattrs之间的区别是什么?更具体地说,哪些标签有attrsattrMap

>>> 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)将做正确的事情。

10-07 15:14