El operador in
es para tipos de secuencia y mapeo, ¿qué le hace pensar que el objeto devuelto por BeautifulSoup
se supone que debe implementarlo correctamente? De acuerdo con los documentos de BeautifulSoup, debe acceder a los atributos utilizando la sintaxis []
.
Re hasattr
, creo que confundió atributos HTML/XML y atributos de objeto Python. hasattr
es para este último y BeaitufulSoup AFAIK no refleja los atributos HTML/XML que analizó en sus propios atributos de objeto.
P.S. tenga en cuenta que el objeto Tag
en BeautifulSoup
hace implementar __contains__
- ¿entonces quizás esté intentando con el objeto equivocado? ¿Puedes mostrar un ejemplo completo pero mínimo que demuestre el problema?
La ejecución de este:
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']
me sale:
<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'
que es lo que esperaba. El primer el
tiene un atributo at
, el segundo no - y esto arroja un KeyError
.
Actualización 2: BeautifulSoup.Tag.__contains__
la mira dentro de los contenidos de la etiqueta, no sus atributos. Para verificar si existe un atributo, use in
.
'str' no es su La mejor opción para un nombre varible, ya que enmascara el tipo de cadena integrada. ¿Qué tal algo como 'xmltext'? – PaulMcG