Поле attrMap
является внутренним полем в классе Tag
.Вы не должны использовать это в своем коде.Вместо этого вы должны использовать
value = tag[key]
tag[key] = value
Это внутренне сопоставляется с tag.attrMap[key]
, но только после того, как __getitem__
и __setitem__
обязательно инициализируют self.attrMap
.Это делается в _getAttrMap
, что не является сложным вызовом dict(self.attrs)
.Так что для вашего кода вы будете использовать
>>> url = "/5919687/raznitsa-mezhdu-attrmap-i-attrs-v-beautifulsoup"
>>> 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)
будет делать правильные вещи.