[pyar] extraer texto de un html

760 views
Skip to first unread message

David Moreno

unread,
Nov 24, 2010, 4:48:22 AM11/24/10
to py...@python.org.ar
hola

    quiero recuperar de un html un texto, el texto en si siempre está entre dos etiquetas html. no se si me explico bien, pongo un ejemplo bastante simple

<head>
    texto
</head>
<body>
    texto
    <div>
        texto que quiero recuperar
    </div>
    texto
</body>

en el ejemplo, el texto que quiero recuperar está siempre entre <div> y </div> ¿alguna idea de como extraer ese texto? gracias

PD: ya tabulo hasta el html XD
--
firmaCorreo4.jpg

matias benedetto

unread,
Nov 24, 2010, 5:02:25 AM11/24/10
to Python Argentina
>en el ejemplo, el texto que quiero recuperar está siempre entre <div> y </div> ¿alguna idea de como extraer >ese texto? gracias

Hace poco se habló esto en la lista. Algunos muchachos recomendaron la libreria BeatifulSoup y otros PyQuey.
Yo empeze a usar PyQuery, usa los selectores de JQuery, a mi me parece muy copada, te recomiendo que le eches una mirada: http://packages.python.org/pyquery/ , los ejemplos son bastante claros.

Saludos.

nicolás rosbaco

unread,
Nov 24, 2010, 5:16:21 AM11/24/10
to Python Argentina
Hola (de paso me presento) me llamo nicolás y recién entro en la lista.

Estoy empezando con python y mi nivel es menos 3 (más o menos)

La pregunta: entre a la página que remitís e intente el ejemplo. Me sale el siguiente error:

ImportError: No module named pyquery

Yo uso ubuntu y tengo instalado python... ¿es que aparte debo ir incorporando las librerias? ¿cómo?


Bueno gracias y un saludo desde la patagonía argentina

2010/11/24 matias benedetto <matias.b...@gmail.com>
_______________________________________________
pyar mailing list py...@python.org.ar
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/



--
"En un país colonial las oligarquías son las dueñas de los diccionarios" (John William Cooke)

Hystrix

unread,
Nov 24, 2010, 5:45:01 AM11/24/10
to Python Argentina
2010/11/24 David Moreno <lame...@gmail.com>

>
> hola
>
>     quiero recuperar de un html un texto, el texto en si siempre está entre dos etiquetas html. no se si me explico bien, pongo un ejemplo bastante simple

Para cosas sencillas podes probar con Element Tree

http://docs.python.org/library/xml.etree.elementtree.html

En la documentacion hay un ejemplo breve pero que hace parte de lo que
vos buscas. Si el html esta bien estructurado y no necesitas algo muy
complejo me parece una buena opcion porque ya viene con Python, no
necesitas instalar nada ni agregarte una dependencia.

--
Hystrix

Martin Cerdeira

unread,
Nov 24, 2010, 7:50:39 AM11/24/10
to Python Argentina
2010/11/24 David Moreno <lame...@gmail.com>
_______________________________________________
pyar mailing list py...@python.org.ar
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

Siempre podés utilizar re. Claro que...

"Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems."
jwz
-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
()  ascii ribbon campaign
/\  www.asciiribbon.org  

David Moreno

unread,
Nov 24, 2010, 7:52:12 AM11/24/10
to Python Argentina
quizá la web estubiera caida en ese momento, ahora funciona bien. gracias por el enlace.


El 24/11/10 11:16, nicolás rosbaco escribió:
firmaCorreo4.jpg

David Moreno

unread,
Nov 24, 2010, 7:54:37 AM11/24/10
to Python Argentina
gracias por el link, lo leere con calma cuando tenga un rato largo, mi inglés es nivel tarzan ;)


El 24/11/10 11:45, Hystrix escribió:
firmaCorreo4.jpg

Federico Heinz

unread,
Nov 24, 2010, 10:30:18 AM11/24/10
to py...@python.org.ar
On 24/11/2010, Martin Cerdeira wrote:
> "Some people, when confronted with a problem, think "I know, I'll
> use regular expressions." Now they have two problems."

Lo que, por supuesto, sería cierto si la cita dijera "any problem" en
vez de "a problem". Cuando el problema es parsear un lenguaje
regular, las expresiones regulares son la solución ideal. Para
todos los demás problemas (entre los cuales está el de extraer texto
de un html), son todo lo contrario. Pero decir que las expresiones
regulares son un problema en sí, es tan necio como querer usarlas
para culquier cosa.

Fede

Ricardo Daniel Quiroga

unread,
Nov 24, 2010, 11:05:09 AM11/24/10
to Python Argentina


2010/11/24 David Moreno <lame...@gmail.com>

hola

    quiero recuperar de un html un texto, el texto en si siempre está entre dos etiquetas html. no se si me explico bien, pongo un ejemplo bastante simple

<head>
    texto
</head>
<body>
    texto
    <div>
        texto que quiero recuperar
    </div>
    texto
</body>


ehh sgmllib.SGMLParser te suena... :P yo uso eso para extraer el texto de los HTML, en realidad saca cualquier cosa que este en medio de los tags usando handle_data()...




David Moreno

unread,
Nov 24, 2010, 1:27:26 PM11/24/10
to Python Argentina
he estado buscando un poco por la red, pero no termino de hacerme con el, ¿podrías ponerme un ejemplo facilito?


El 24/11/10 17:05, Ricardo Daniel Quiroga escribió:
_______________________________________________ pyar mailing list py...@python.org.ar
firmaCorreo4.jpg

Martin Cerdeira

unread,
Nov 24, 2010, 1:37:50 PM11/24/10
to Python Argentina
2010/11/24 Federico Heinz <fhe...@vialibre.org.ar>:

El chiste es que, muchas veces las re son tán dificiles de armar o
debuggear que, generan ese 'segundo problema', a eso se refería jwz
[0]
Por supuesto, debe ser tomado como una broma, nadie cuestiona el
poder[0] de las re (de hecho, fue mi sugerencia)
Saludos

[0] http://www.jwz.org/
[1] http://xkcd.com/208/


-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
()  ascii ribbon campaign
/\  www.asciiribbon.org

gustavo c

unread,
Nov 24, 2010, 1:39:28 PM11/24/10
to Python Argentina
> 2010/11/24 David Moreno <lame...@gmail.com>
>>
>> hola
>>
>>     quiero recuperar de un html un texto, el texto en si siempre está entre dos etiquetas html. no se si me explico bien, pongo un ejemplo bastante simple
>>
>> <head>
>>     texto
>> </head>
>> <body>
>>     texto
>>     <div>
>>         texto que quiero recuperar
>>     </div>
>>     texto
>> </body>
>

te recomiendo que aprendas expresiones regulares.
vos necesitas el texto que matchea <div>cualquirCosa</div>

te dejo un link con ejemplos simples:
http://mundogeek.net/archivos/2008/04/09/python-expresiones-regulares/

--
gustavo c

Lautaro Pecile

unread,
Nov 24, 2010, 1:53:27 PM11/24/10
to Python Argentina
Hola:

Puede ser que esto sea lo que necesitás?

>>> import HTMLParser
>>> class TextStripper(HTMLParser.HTMLParser):
... def __init__(self):
... self.reset()
... self.fed = []
...
... def handle_data(self, d):
... self.fed.append(d)
...
... @property
... def get_text(self):
... return ''.join(self.fed)
...
>>> x = TextStripper()
>>> x.feed(<string con html>)
>>> x.get_text

Saludos

Lautaro

Sebastian Bassi

unread,
Nov 24, 2010, 1:55:26 PM11/24/10
to Python Argentina
2010/11/24 gustavo c <p8q...@gmail.com>

te recomiendo que aprendas expresiones regulares.
vos necesitas el texto que matchea <div>cualquirCosa</div>
te dejo un link con ejemplos simples:
http://mundogeek.net/archivos/2008/04/09/python-expresiones-regulares/

Creo que usar regex para estas cosas es reinventar la rueda. Las libs que sugirieron aca usan regex para que nosotros no tengamos que hacerlo. El ejemplo que dio David puede ser trivial, pero el HTML acepta mas cosas que las que se ven "a simple vista" (espacios, tabs y retornos de carro como si fuesen lo mismo) y ni hablar si ademas incluimos HTML malformado (con tags que se cierran donde no corresponde, o que se anidan mas, etc).

David Moreno

unread,
Nov 24, 2010, 2:18:34 PM11/24/10
to Python Argentina
acabo de tener una idea tonta que quizá facilite el proceso (soy novato para mi sigue siendo un galimatías)

si separo el texto en dos partes usando <div> como divisor, y descarto la primera parte, y vuelvo a dividir el texto en otras dos partes utilizando </div> como divisor, obtendría el texto que quiero. creo que voy a usar split y a ver si hay suerte.

PASO 1:


<head>
    texto
</head>
<body>
    texto
    <div>


        texto que quiero recuperar
    </div>
    texto
</body>

PASO 2:


        texto que quiero recuperar

    </div>
    texto
</body>




El 24/11/10 19:55, Sebastian Bassi escribió:
_______________________________________________ pyar mailing list py...@python.org.ar
firmaCorreo4.jpg

Fabian Ezequiel Gallina

unread,
Nov 24, 2010, 2:31:53 PM11/24/10
to Python Argentina
El día 24 de noviembre de 2010 15:37, Martin Cerdeira
<martinc...@gmail.com> escribió:

> 2010/11/24 Federico Heinz <fhe...@vialibre.org.ar>:
>> On 24/11/2010, Martin Cerdeira wrote:
>>> "Some people, when confronted with a problem, think "I know, I'll
>>> use regular expressions." Now they have two problems."
>>
>> Lo que, por supuesto, sería cierto si la cita dijera "any problem" en
>> vez de "a problem". Cuando el problema es parsear un lenguaje
>> regular, las expresiones regulares son la solución ideal. Para
>> todos los demás problemas (entre los cuales está el de extraer texto
>> de un html), son todo lo contrario. Pero decir que las expresiones
>> regulares son un problema en sí, es tan necio como querer usarlas
>> para culquier cosa.
>>

La dificultad de parsear XML (y sus amigos) con expresiones regulares
viene de que XML no es un lenguage regular.

Aca una explicación super experta de la situación[0]

[0] http://stackoverflow.com/questions/1732348?tab=votes#tab-top


Saludos,
--
Fabián E. Gallina
http://www.from-the-cloud.com

Ricardo Daniel Quiroga

unread,
Nov 24, 2010, 2:35:21 PM11/24/10
to Python Argentina


2010/11/24 Lautaro Pecile <lautaro...@gmail.com>

>>> import HTMLParser
>>> class TextStripper(HTMLParser.HTMLParser):
...     def __init__(self):
...         self.reset()
...         self.fed = []
...
...     def handle_data(self, d):
...         self.fed.append(d)
...
...     @property
...     def get_text(self):
...         return ''.join(self.fed)
...
>>> x = TextStripper()
>>> x.feed(<string con html>)
>>> x.get_text

Saludos

Hola

   El te puso el ejemplo pero usando HTMLParser en ves de SGMLParser.. (HTMLParse es un deribado de este) el codigo es exactament el mismo :P 

HTML está definido en términos del SGML. XML es un estándar de creación posterior..

    De ultima si tenes q seguir recurriendo a las expresiones regulares usa "Kiki" este bobo programita (hecho python) es bastante util a la hora de crear y probar expresiones regulares..

Saludos

N Cis

unread,
Nov 24, 2010, 7:14:12 PM11/24/10
to py...@python.org.ar
Te recomiendo buscar en la lista de pyar por 3 lineas de correos con estos asuntos:
* Novatisimo: No puedo instalar pyquery
* Hola mundo y primera consulta con lxml
* Expresiones regulares y el "Matches if ... doesn't match next"

En esos temas se trata un poco lo que buscas.
En resumen: cuando se habla de procesar html hay que evitar expresiones regulares (cthulu), lo que se recomienda usar es Pyquery (lxml) o beautifulSoup.
Las principales diferencias, segun mi experiencia, beautifulsoup esta completamente escrita en python, eso significa que para instalarlo solo nececitas bajar el source, ponerlo donde vas a trabajar (o copiarlo en la ruta del python) y hacer el import. Creo que por estar completamente hecha en python el rendimiento (velocidad) es menor, pero ganas la ventaja de la portabilidad.
Lxml (pyquery es solo una fachada para usar lxml estilo jquery) es una libreria hecha en C (segun lo que tengo entendido), en ubuntu si no tenes 10.10 (o superior, capas 10.04 tmb), la tenes que compilar. En las nuevas versiones esta en los repositorios. En otras distros, ni idea. Puede, como que no, estar en los repositorios.

Si estas haciendo una aplicacion que pensas distribuir, cumplir con las dependencias siempre es algo que vas a tener en cuenta. Eso va a hacer qe capas te inclines por BeautifulSoup.

En lo que respecta a funcionalidad, en este momento, creo que la que soporta html más sucio es lxml, la verdad ni idea.

Si usas beautifulSoup, obtener el texto del html es tan facil como hacer:

>>> from BeautifulSoup import BeautifulSoup as BS
>>> html = """
... <head>
...     texto
... </head>
... <body>
...     texto
...     <div>
...         texto que quiero recuperar
...     </div>
...     texto
... </body>"""
>>> texto = BS(html)
>>> print texto.text
textotextotexto que quiero recuperartexto

Saludos.

David Moreno

unread,
Nov 25, 2010, 4:33:00 AM11/25/10
to Python Argentina
siiii!! por fin lo tengo!! gracias a todos :D

>>> import BeautifulSoup
>>> html="""<head>
... cabecera
... </head>
... <body>
... cuerpo
... </body>
... """
>>> soup=BeautifulSoup.BeautifulSoup(html)
>>> print soup.find("head")
<head>
cabecera
</head>



El 25/11/10 01:14, N Cis escribió:
firmaCorreo4.jpg

gustavo c

unread,
Nov 25, 2010, 7:45:27 AM11/25/10
to Python Argentina
On Wed, Nov 24, 2010 at 03:55:26PM -0300, Sebastian Bassi wrote:
> 2010/11/24 gustavo c <p8q...@gmail.com>
>
> > te recomiendo que aprendas expresiones regulares.
> > vos necesitas el texto que matchea <div>cualquirCosa</div>
> > te dejo un link con ejemplos simples:
> > http://mundogeek.net/archivos/2008/04/09/python-expresiones-regulares/
> >
>
> Creo que usar regex para estas cosas es reinventar la rueda. Las libs que

El primer renglón dice "recomiendo que aprendas ..."
Dado la búsqueda que se necesita, es una buena oportunidad de aprender.
Con respecto a "usar regex para estas cosas es reinventar la rueda".
Si la persona que empezó este hilo conoce regex, no mandaba ninguna
consulta.

Otra cuestión que es más difícil de ver, es cuando usar POO. No sabemos
en que terminará el sistema de busqueda de texto del texto html, pero si es
bueno aprovechar para decir que POO es básicamente una forma de modelar,
no la única, y no tiene sentido usarlo cuando no vemos un conjunto de
objetos que se comunican entre si. No voy a seguir con esto, estamos
fuera del hilo.

Sigo recomendando aprender, porque adquirir conocimiento es la base de
la libertad.

un saludo,

--
Gustavo C [mutt]
twitter: @fromgus

Mariano Guerra

unread,
Nov 25, 2010, 7:05:33 PM11/25/10
to Python Argentina
2010/11/24 gustavo c <p8q...@gmail.com>:

> te recomiendo que aprendas expresiones regulares.
> vos necesitas el texto que matchea <div>cualquirCosa</div>
>
> te dejo un link con ejemplos simples:
> http://mundogeek.net/archivos/2008/04/09/python-expresiones-regulares/

no uses expresiones regulares para parsear html:

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

Reply all
Reply to author
Forward
0 new messages