Foros del Web » Programando para Internet » Python »

Hola mundo y primera consulta con lxml

Estas en el tema de Hola mundo y primera consulta con lxml en el foro de Python en Foros del Web. Hola gente!! Bueno ,como es debido a ca va mi hola mundo. Código: hola = 'h' + 'o' + 'l' + 'a' + ' ' ...
  #1 (permalink)  
Antiguo 08/09/2010, 20:13
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1
Antigüedad: 14 años, 2 meses
Puntos: 0
Hola mundo y primera consulta con lxml

Hola gente!! Bueno ,como es debido a ca va mi hola mundo.

Código:
hola = 'h' + 'o' + 'l' + 'a' + ' '
hola = hola + 'm' + 'u' + 'n' + 'd' + 'o'
print '%s' % (hola)

Estoy empezando a jugar / aprender python y estoy empezando un
pryectito. Asi que como buen
newbie acepto todas las criticas que me hagan para ir mejorando.
Necesito sacar información de una página de internet y lo primero que
se me ocurrio fue tratarlo como xml y usar xpath.
Para eso encontre la librería lxml y decidí usarla.
La idea es sacar información de un articulo de un diario (en este caso
de La Voz el interior por ejemplo) y guardar la informacion relevante
en un xml.
El problema que estoy teniendo ahora es que me da la sensación que
lxml me esta rompiendo de alguna forma la codificación de caracteres.
Aclaro que a lo mejor estoy haciendo cualquiera y no tengo idea.

Código de prueba (aclaro que la elección del articulo fue totalmete
aleatoria, jaja)
Código:
# -*- coding: utf-8 -*-
# Mision, ver por que carajo lxml me rompe la codificacion de caracteres.
# Se supone que la voz tiene en el encabezado utf8 como codificacion
from lxml import html, etree
import nltk

Notaxml = html.parse("http://www.lavoz.com.ar/noticias/politica/%E2%80%9Cen-el-pais-de-moyanolandia-suceden-estas-cosas%E2%80%9D")

#opcion 1
Tituloxml = Notaxml.xpath("/html/body/div[@class='layout']/div[@class='Contenido']/div[@class='Columnas
clearfix']/*/div[@class='CD clearfix']/*/div[@class='Art']/h2")
Titulostring = etree.tostring(Tituloxml[0], encoding='UTF-8' )
Titulostring = nltk.clean_html(Titulostring)
print Titulostring

#ocion 2
Titulostring = Notaxml.xpath("/html/body/div[@class='layout']/div[@class='Contenido']/div[@class='Columnas
clearfix']/*/div[@class='CD clearfix']/*/div[@class='Art']/h2/text()")
print Titulostring

#en las dos me reta cuando quiero hacer esto.
Articulo = etree.Element('Articulo')
Diario = etree.SubElement(Articulo, 'Diario')
Diario.text = 'La Voz del Interior'
Titulo = etree.SubElement(Articulo, 'Titulo')
Titulo.text = Titulostring
print(etree.tostring(Articulo, pretty_print=True))
Articuloxml = etree.ElementTree(Articulo)
Articuloxml.write('pru.xml', pretty_print=True)
Salida del código

Código:
<h2>Tras el pedido de conciliación, se normalizó la situación en
las plantas</h2>
[u'Tras el pedido de conciliaci\xc3\xb3n, se normaliz\xc3\xb3 la
situaci\xc3\xb3n en las plantas']
Traceback (most recent call last):
 File "experimento.py", line 22, in <module>
   Titulo.text = Titulostring
 File "lxml.etree.pyx", line 821, in lxml.etree._Element.text.__set__
(src/lxml/lxml.etree.c:32944)
 File "apihelpers.pxi", line 653, in lxml.etree._setNodeText
(src/lxml/lxml.etree.c:15311)
 File "apihelpers.pxi", line 1240, in lxml.etree._utf8
(src/lxml/lxml.etree.c:19826)
TypeError: Argument must be string or unicode.
Me podrían tirar una mano (lo ideal para mi seria, flaco aca estas
metiendo fruta, mete esta opcion, o lo que sea) o diganme en que me
estoy equivocando y donde puedo leer para entender que esta pasando.

Muchas gracias.
  #2 (permalink)  
Antiguo 08/09/2010, 21:58
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Hola mundo y primera consulta con lxml

Bienvenido a Foros Del Web mebordone

En esta parte del codigo

Código Python:
Ver original
  1. Titulo.text = Titulostring

Titulostring ya no es mas un string es una cadena, tienes que convertirla a string.

Código Python:
Ver original
  1. Titulo.text = ''.join(Titulostring)

Version completa:
Código Python:
Ver original
  1. # -*- coding: utf-8 -*-
  2. # Mision, ver por que carajo lxml me rompe la codificacion de caracteres.
  3. # Se supone que la voz tiene en el encabezado utf8 como codificacion
  4. from lxml import html, etree
  5. import nltk
  6.  
  7. Notaxml = html.parse("http://www.lavoz.com.ar/noticias/politica/%E2%80%9Cen-el-pais-de-moyanolandia-suceden-estas-cosas%E2%80%9D")
  8.  
  9. #opcion 1
  10. Tituloxml = Notaxml.xpath("/html/body/div[@class='layout']/div[@class='Contenido']/div[@class='Columnasclearfix']/*/div[@class='CD clearfix']/*/div[@class='Art']/h2")
  11. Titulostring = etree.tostring(Tituloxml[0], encoding='UTF-8' )
  12. Titulostring = nltk.clean_html(Titulostring)
  13. print Titulostring #Hasta aqui vas bien
  14.  
  15. #ocion 2
  16. Titulostring = Notaxml.xpath("/html/body/div[@class='layout']/div[@class='Contenido']/div[@class='Columnasclearfix']/*/div[@class='CD clearfix']/*/div[@class='Art']/h2/text()")
  17. print Titulostring #Wow aqui Titulostring es ahora una lista
  18.  
  19. #en las dos me reta cuando quiero hacer esto.
  20. Articulo = etree.Element('Articulo')
  21. Diario = etree.SubElement(Articulo, 'Diario')
  22. Diario.text = 'La Voz del Interior'
  23. Titulo = etree.SubElement(Articulo, 'Titulo')
  24. Titulo.text = Titulostring #Titulo.text tiene que ser un string no una lista
  25. #Fix: Titulo.text = ''.join(Titulostring) #Funciona en caso que solo tenga un string
  26. print(etree.tostring(Articulo, pretty_print=True))
  27. Articuloxml = etree.ElementTree(Articulo)
  28. Articuloxml.write('pru.xml', pretty_print=True)

Última edición por razpeitia; 08/09/2010 a las 22:19

Etiquetas: hola, mundo, primera
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:41.