Foros del Web » Programando para Internet » Python »

Etiquetas con expresiones regulares

Estas en el tema de Etiquetas con expresiones regulares en el foro de Python en Foros del Web. Estoy leyendo una pagina con python con la intención que me obtenga los valores de una etiqueta href y su descripción. me explico: tengo lo ...
  #1 (permalink)  
Antiguo 01/09/2011, 06:50
 
Fecha de Ingreso: marzo-2009
Mensajes: 41
Antigüedad: 15 años, 8 meses
Puntos: 1
Etiquetas con expresiones regulares

Estoy leyendo una pagina con python con la intención que me obtenga los valores de una etiqueta href y su descripción. me explico:

tengo lo siguiente, de una lista de fechas de nacimiento, donde al hacer click al id lleva a mas datos de la persona.
Código HTML:
Ver original
  1. <a href="index.php?id=1111">23/08/1980&nbsp;</a>
  2. <a href="index.php?id=1111">CARLOS RIQUELME &nbsp;</a>
  3.  
  4. <a href="index.php?id=1112">20-04-1983</a>
  5. <a href="index.php?id=1112">Luis Sobarso</a>
  6.  
  7. <a href="index.php?id=1113">11/03</a>
  8. <a href="index.php?id=1113">
  9.                
  10.                     Ana López
  11.                
  12.            
  13. </a>

Si se fijan cada id tiene dos valores fecha y nombre, como tiene que ser la exprecion regular para que me encuentre todos??

tengo lo siguiente que encontré por ahí

Código Python:
Ver original
  1. import httplib2
  2. import re
  3.  
  4. h = httplib2.Http('.cache')
  5. response, content = h.request(url)
  6. link = re.compile(b'<a href=\"index.php\?id=([\d]+)\">(.*?)<\/a>')
  7. personas = link_of.findall(content)

obtengo un array de las personas, pero no esta Ana Lopez (seguro que por los \r\n\t no se como y donde ponerlos) y en Carlos Riquelme me deja el &nbsp;
  #2 (permalink)  
Antiguo 01/09/2011, 08:22
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Etiquetas con expresiones regulares

Para "Ana Lopez" agregale re.DOTALL a compile. Eso hará que el punto coincida con saltos de línea (por defecto no lo hace):
Código Python:
Ver original
  1. re.compile(' el patron...', re.DOTALL)

En el caso de "CARLOS RIQUELME" el problema es que le estás pidiendo que coincida con cualquier caracter.
Quizás tengas más suerte limitando la búsqueda a letras o espacios, pero eso te puede dar problemas en el futuro con apellidos "raros": si tu patrón pasa a ser "[a-zA-Z ]", ¿qué pasará cuando tengas el apellido "O'Neill"?
Si sabes que siempre será un nombre y un apellido, podrías limitar la búsqueda a dos partes separadas por espacio:
(.+? .+?)
pero eso ya depende de cómo estén los datos en la página original.
Lo que quiero decir es que es un problema difícil de solucionar sin generar errores, y sería bastante molesto ir eliminando casos particulares.


Saludos.
  #3 (permalink)  
Antiguo 01/09/2011, 09:28
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: Etiquetas con expresiones regulares

No uses expresiones regulares para parsear HTML. Mejor usa un parser HTML como lxml.
Código Python:
Ver original
  1. from lxml import etree
  2.  
  3. s = u"""<a href="index.php?id=1111">23/08/1980&nbsp;</a>
  4. <a href="index.php?id=1111">CARLOS RIQUELME &nbsp;</a>
  5.  
  6. <a href="index.php?id=1112">20-04-1983</a>
  7. <a href="index.php?id=1112">Luis Sobarso</a>
  8.  
  9. <a href="index.php?id=1113">11/03</a>
  10. <a href="index.php?id=1113">
  11.                
  12.                    Ana Lopez
  13.                
  14.            
  15. </a>"""
  16.  
  17. root = etree.HTML(s)
  18. for i in root.xpath("//a"):
  19.     print i.get('href'), i.text

Etiquetas: phyton3
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 12:08.