[pyar] BeautifulSoup y membership-test

Patricio Molina patriciomolina en gmail.com
Vie Feb 4 11:28:24 ART 2011


2011/2/4 Juan A. Diaz <juan en linux.org.ar>:
> Hoy me encontré con este comportamiento que a mi parecer es bastante
> feo.
>
>>>> from BeautifulSoup import BeautifulSoup
>>>> data="""<input id="id_cleric_focus" class="vTextField"
> name="cleric_focus" maxlength="256" type="text">"""
>>>> soup = BeautifulSoup(data)
>>>> x = soup.find('input')
>>>> x.has_key('name')
> True
>>>> 'name' in x
> False
>>>> x.__class__
> <class BeautifulSoup.Tag at 0x10eb8b10>
>>>> import BeautifulSoup
>>>> BeautifulSoup.__version__
> '3.1.0.1'
>>>>
>
> Instale la ultima versión en un virtualenv y tuve el mismo resultado
>>>> import BeautifulSoup
>>>> BeautifulSoup.__version__
> '3.2.0'
>>>>
>
> Como el has_key[0] nunca me callo bien y además esta deprecado, siempre
> uso 'key in d'. Por otro lado, si bien ese objeto ('x') no es
> precisamente un tipo standar, considero que para ofrecer consistencia
> tanto 'key in d' como 'd.has_key(key) deberían retornar el mismo
> resultado.
>
> Leyendo un poco el código de BeautifulSoup[1] (bzr co lp:beautifulsoup)
> veo que el methodo __contains__[2] esta implementado, pero lo que en
> realidad verifica es otra cosa.
>
> Vean
>
>>>> data = '<div id="test">bla</div>'
>>>> soup = BeautifulSoup(data)
>>>> x = soup.find('div')
>>>> x.__class__
> <class BeautifulSoup.Tag at 0x10dec2d0>
>>>> x.has_key('id')
> True
>>>> 'id' in x
> False
>>>> 'bla' in x
> True
>>>>
>
> Soy solo yo o creo es poco pythonico? y que cuando has_key quede fuera
> de uso, usar has_key en BeautifulSoup va a ser creepy? Debería reportar
> un bug verdad?
>
> [0] http://docs.python.org/library/stdtypes.html#dict.has_key
> [1] https://code.launchpad.net/beautifulsoup
> [2]
> http://docs.python.org/reference/expressions.html#membership-test-details
>
>
> Saludos.
>
> nueces...
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>

A mí me parece que está bien, porque 'name' es un atributo del
elemento HTML que estás analizando, no un contenido. Si tenés "<div
name='algo'>bla</div>", es mucho más lógico (al menos para mí) que
"'bla' in x" devuelva True y que el atributo 'name' sea accesible a
través de un método como has_key(), de lo contrario habría
ambigüedades.

Saludos



More information about the pyar mailing list