[Python-es] Seleccionar una etiqueta en especial con HTMLParser

Ricardo Azpeitia Pimentel razpeitia en gmail.com
Dom Ago 10 04:54:51 CEST 2014


Por favor una una librería de verdad para parsear tu HTML.

Puedes usar beautifulSoup en caso que no tengas un compilador de C, o en
caso que tengas uno lxml es una excelente opción.

Razones para usar una librería:
1. Es fácil.
2. Es rápido. Incluso mas rápido que las librerías integradas.
3. Es mas robusto. Hay un motón de escenarios donde html parser simplemente
no aguantara.

Razones para no usar una librería:
1. Estas trabajando con embebidos.

Enserio no veo ningún pretexto para no usar una librería completa.

Puedes intentar hacerlo htmlparse pero eso implicaría que tendrías que
construir tu propio arbol (DOM), satinizar tus propias cosas, (como cerrar
etiquetas, checar que encoding usa, etc, etc, ), hacer tu propio lenguaje
para hacer queries al dom (selectores vs xpath). En fin hay un montón de
casos que jamas te habías imaginado.

Es ridículamente sencillo como, parsear html con una librería:
<importar libreria>
<instanciar objeto de la libreria con html>
<hacer query con selectors o xpath>

http://www.crummy.com/software/BeautifulSoup/bs4/doc/

Buena suerte.


El 9 de agosto de 2014, 14:08, Alexandro Colorado <jza en oooes.org> escribió:

> Hola Kiko, has podido revisarlo?
>
> On 8/6/14, Kiko <kikocorreoso en gmail.com> wrote:
> > estoy en el móvil y no puedo revisar lo que digo pero creo que
> > HTMLParser tiene métodos para saber dónde te encuentras. Puedes buscar
> > la posición del body y si te encuentras más allá pues te paras...
> >
> > Si encuentro tiempo intento elaborar la respuesta más tarde.
> >
> > El 6/8/14, Alexandro Colorado <jza en oooes.org> escribió:
> >> Gracias, por resolver mi duda, aunque el script no me funciono supongo
> >> por que al tener doctypes u algo malformado. Alguna sugerencia en como
> >> ignorar el parsing a partir de ciertas lineas como el <body>? Auqnue
> >> no sean parte de HTML.parse.
> >>
> >> Gracias.
> >>
> >> On 8/6/14, Kiko <kikocorreoso en gmail.com> wrote:
> >>> Hola.
> >>>
> >>> Un ejemplo sencillo con HTMLParser:
> >>>
> >>> *# Importamos librerías*
> >>> *import requests*
> >>> *from html.parser import HTMLParser*
> >>>
> >>> *# Primero cojo unos datos con requests*
> >>> *# Si no tienes requests puedes usar urllib*
> >>> *data = str(requests.get("http://pybonacci.org
> >>> <http://pybonacci.org>").content)*
> >>>
> >>> *# Creo una clase para el uso que le quiero dar a HTMLParser*
> >>> *class Parser(HTMLParser):*
> >>> *    def handle_starttag(self, tag, attrs):*
> >>> *        if tag == 'img':*
> >>> *            print("Start tag:", tag)*
> >>> *            for attr in attrs:*
> >>> *                if attr[0] == 'src':*
> >>> *                    print(attr[1])*
> >>>
> >>> *# Et voilá*
> >>> *parser = Parser()*
> >>> *parser.feed(data)*
> >>>
> >>> Adapta la clase Parser al uso que le vayas a dar y listo. Mira los
> >>> métodos
> >>> handle_data, etc, en los ejemplos en [1].
> >>>
> >>> El código anterior es Python3, en Python2 deberás cambiar alguna
> cosita.
> >>>
> >>> [1] https://docs.python.org/3.4/library/html.parser.html
> >>>
> >>>
> >>>
> >>> El 5 de agosto de 2014, 17:31, Alexandro Colorado <jza en oooes.org>
> >>> escribió:
> >>>
> >>>> Y en html.parser hay una opcion para seleccionar el tag a parsear?
> >>>>
> >>>> On 8/5/14, lasizoillo <lasizoillo en gmail.com> wrote:
> >>>> > El día 4 de agosto de 2014, 23:53, Miguel Beltran R.
> >>>> > <yourpadre en gmail.com> escribió:
> >>>> >> No conozco html.parser pero si tu codigo HTML esta bien escribo
> >>>> >> podrias
> >>>> >> usar
> >>>> >> lxml y hacer una busqueda con el (cosa que no recuerdo como se
> hace,
> >>>> pero
> >>>> >> creo que si la tenía)
> >>>> >>
> >>>> >
> >>>> > Coincido con la recomendación de lxml.
> >>>> >
> >>>> > Puede parsear html
> >>>> > http://lxml.de/parsing.html#parsing-html
> >>>> >
> >>>> > Se pueden usar selectores css:
> >>>> > http://lxml.de/cssselect.html
> >>>> > y xpath:
> >>>> > http://lxml.de/xpathxslt.html
> >>>> >
> >>>> > Aparte de eso, funciona muy bien con ficheros muy grandes
> >>>> >
> >>>>
> http://stackoverflow.com/questions/9856163/using-lxml-and-iterparse-to-parse-a-big-1gb-xml-file
> >>>> >
> >>>> > Un saludo,
> >>>> >
> >>>> > javi
> >>>> >
> >>>> >>
> >>>> >> 2014-08-04 15:02 GMT-05:00 Alexandro Colorado <jza en oooes.org>:
> >>>> >>
> >>>> >>> Saludos una pregunta sencilla. Quiero seleccionar una etiqueta por
> >>>> >>> su
> >>>> >>> clase dentro de un html usando html.parser de python 3.2.
> >>>> >>>
> >>>> >>> El html es grande, y aunque he podido parsear cosas como starttag,
> >>>> >>> y
> >>>> >>> data, ahora quiero limitar el html a unicamente las clases que
> >>>> >>> necesito.  En este caso el tag es
> >>>> >>> <td class="ticket">Costo</td>
> >>>> >>> <td class="value">$ 432.23</td>
> >>>> >>>
> >>>> >>> Gracias.
> >>>> >>>
> >>>> >>> --
> >>>> >>> Alexandro Colorado
> >>>> >>> Apache OpenOffice Contributor
> >>>> >>> 882C 4389 3C27 E8DF 41B9  5C4C 1DB7 9D1C 7F4C 2614
> >>>> >>> _______________________________________________
> >>>> >>> Python-es mailing list
> >>>> >>> Python-es en python.org
> >>>> >>> https://mail.python.org/mailman/listinfo/python-es
> >>>> >>> FAQ: http://python-es-faq.wikidot.com/
> >>>> >>
> >>>> >>
> >>>> >>
> >>>> >>
> >>>> >> --
> >>>> >> ________________________________________
> >>>> >> Lo bueno de vivir un dia mas
> >>>> >> es saber que nos queda un dia menos de vida
> >>>> >>
> >>>> >> _______________________________________________
> >>>> >> Python-es mailing list
> >>>> >> Python-es en python.org
> >>>> >> https://mail.python.org/mailman/listinfo/python-es
> >>>> >> FAQ: http://python-es-faq.wikidot.com/
> >>>> >>
> >>>> > _______________________________________________
> >>>> > Python-es mailing list
> >>>> > Python-es en python.org
> >>>> > https://mail.python.org/mailman/listinfo/python-es
> >>>> > FAQ: http://python-es-faq.wikidot.com/
> >>>> >
> >>>>
> >>>>
> >>>> --
> >>>> Alexandro Colorado
> >>>> Apache OpenOffice Contributor
> >>>> 882C 4389 3C27 E8DF 41B9  5C4C 1DB7 9D1C 7F4C 2614
> >>>> _______________________________________________
> >>>> Python-es mailing list
> >>>> Python-es en python.org
> >>>> https://mail.python.org/mailman/listinfo/python-es
> >>>> FAQ: http://python-es-faq.wikidot.com/
> >>>>
> >>>
> >>
> >>
> >> --
> >> Alexandro Colorado
> >> Apache OpenOffice Contributor
> >> 882C 4389 3C27 E8DF 41B9  5C4C 1DB7 9D1C 7F4C 2614
> >> _______________________________________________
> >> Python-es mailing list
> >> Python-es en python.org
> >> https://mail.python.org/mailman/listinfo/python-es
> >> FAQ: http://python-es-faq.wikidot.com/
> >>
> > _______________________________________________
> > Python-es mailing list
> > Python-es en python.org
> > https://mail.python.org/mailman/listinfo/python-es
> > FAQ: http://python-es-faq.wikidot.com/
> >
>
>
> --
> Alexandro Colorado
> Apache OpenOffice Contributor
> 882C 4389 3C27 E8DF 41B9  5C4C 1DB7 9D1C 7F4C 2614
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140809/04f44b6f/attachment.html>


Más información sobre la lista de distribución Python-es