Разница между attrMap и attrs в BeautifulSoup - PullRequest
3 голосов
/ 13 января 2012

Я хотел бы знать, в чем разница между attrMap и attrs в BeautifulSoup ?Чтобы быть более точным, какие теги имеют 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 Ответ

3 голосов
/ 13 января 2012

Поле 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) будет делать правильные вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...