Оператор in
предназначен для типов последовательности и отображения, что заставляет вас думать, что объект, возвращаемый BeautifulSoup
, должен правильно его реализовывать?Согласно документации BeautifulSoup, вы должны обращаться к атрибутам, используя синтаксис []
.
Re hasattr
, я думаю, вы перепутали атрибуты HTML / XML и атрибуты объектов Python.hasattr
для последнего, и BeaitufulSoup AFAIK не отражает атрибуты HTML / XML, которые он анализировал, в своих собственных атрибутах объекта.
PS обратите внимание, что объект Tag
в BeautifulSoup
реализует __contains__
- так что, возможно, вы пытаетесь использовать не тот объект?Можете ли вы показать полный, но минимальный пример, который демонстрирует проблему?
Запуск этого:
from BeautifulSoup import BeautifulSoup
str = '<el at="some">ABC</el><el>DEF</el>'
z = BeautifulSoup(str)
for x in z.findAll('el'):
print type(x)
print x['at']
Я получаю:
<class 'BeautifulSoup.Tag'>
some
<class 'BeautifulSoup.Tag'>
Traceback (most recent call last):
File "soup4.py", line 8, in <module>
print x['at']
File "C:\Python26\lib\site-packages\BeautifulSoup.py", line 601, in __getitem__
return self._getAttrMap()[key]
KeyError: 'at'
Что яожидается.У первого el
есть атрибут at
, у второго нет - и это выдает KeyError
.
Обновление 2: BeautifulSoup.Tag.__contains__
просматривает содержимое тега, а не его атрибуты.Чтобы проверить, существует ли атрибут, используйте in
.