Pregunta

Estoy tratando de analizar la etiqueta del título en una fuente RSS 2.0 en tres variables diferentes para cada entrada en esa fuente. Usando ElementTree, ya analicé el RSS para que pueda imprimir cada título [menos el ) final con el siguiente código:

feed = getfeed("http://www.tourfilter.com/dallas/rss/by_concert_date")

for item in feed:  
 print repr(item.title[0:-1])

Incluyo eso porque, como puedes ver, item.title es un tipo de datos repr (), del cual no sé mucho.

Un repr particular (item.title [0: -1]) print ed en la ventana interactiva se ve así:

'randy travis (Billy Bobs 3/21'
'Michael Schenker Group (House of Blues Dallas 3/26'

El usuario selecciona una banda y espero, después de analizar cada item.title en 3 variables (una para cada banda, lugar y fecha ... o posiblemente una matriz o I don ' t know ...) selecciona solo aquellos relacionados con la banda seleccionada. Luego se envían a Google para geocodificación, pero esa es otra historia.

He visto algunos ejemplos de regex y estoy leyendo sobre ellos, pero parece muy complicado. ¿Lo es? Pensé que tal vez alguien aquí tendría alguna idea de cómo hacer esto de manera inteligente. ¿Debo usar el módulo re ? ¿Importa que la salida actualmente sea de repr () s? ¿Hay alguna manera mejor? Estaba pensando que usaría un bucle como (y este es mi pseudoPython, solo un tipo de notas que estoy escribiendo):

     list = bandRaw,venue,date,latLong  
     for item in feed:  
      parse item.title for bandRaw, venue, date  
       if bandRaw == str(band)   
        send venue name + ", Dallas, TX" to google for geocoding  
        return lat,long  
      list = list + return character + bandRaw + "," + venue + "," + date + "," + lat + "," + long  
     else  

Al final, necesito tener las entradas elegidas en un archivo .csv (delimitado por comas) con este aspecto:

band,venue,date,lat,long  
randy travis,Billy Bobs,3/21,1234.5678,1234.5678  
Michael Schenker Group,House of Blues Dallas,3/26,4321.8765,4321.8765

Espero que esto no sea mucho pedir. Lo buscaré por mi cuenta, solo pensé que debería publicar aquí para asegurarme de que recibí respuesta.

Entonces, la pregunta es, ¿cuál es la mejor manera de analizar cada repr (item.title [0: -1]) en el feed en los 3 valores separados que Entonces puedo concatenar en un archivo .csv?

¿Fue útil?

Solución

No dejes que las expresiones regulares te asusten ... vale la pena aprender.

Teniendo en cuenta los ejemplos anteriores, puede intentar volver a colocar el paréntesis final y luego usar este patrón:

import re
pat = re.compile('([\w\s]+)\(([\w\s]+)(\d+/\d+)\)')
info = pat.match(s)
print info.groups()

('Michael Schenker Group ', 'House of Blues Dallas ', '3/26')

Para acceder a cada grupo individual, simplemente llámelos al objeto info :

print info.group(1) # or info.groups()[0]

print '"%s","%s","%s"' % (info.group(1), info.group(2), info.group(3))
"Michael Schenker Group","House of Blues Dallas","3/26"

Lo difícil de las expresiones regulares en este caso es asegurarse de que conoce todos los caracteres posibles conocidos en el título. Si hay caracteres no alfa en la parte del 'Grupo de Michael Schenker', tendrá que ajustar la expresión regular de esa parte para permitirlos.

El patrón anterior se divide de la siguiente manera, que se analiza de izquierda a derecha:

([\ w \ s] +) : haga coincidir cualquier palabra o espacio con los caracteres (el símbolo más indica que debe haber uno o más de estos caracteres). Los paréntesis significan que la coincidencia se capturará como un grupo. Este es el " Michael Schenker Group " parte. Si puede haber números y guiones aquí, querrá modificar las piezas entre los corchetes, que son los caracteres posibles para el conjunto.

\ (: un paréntesis literal. La barra diagonal inversa se escapa del paréntesis, ya que de lo contrario cuenta como un comando de expresiones regulares. Esta es la parte " (" parte de la cadena.

([\ w \ s] +) : Igual que el anterior, pero esta vez coincide con " House of Blues Dallas " parte. Entre paréntesis para que sean capturados como el segundo grupo.

(\ d + / \ d +) : hace coincidir los dígitos 3 y 26 con una barra en el centro. Entre paréntesis para que sean capturados como el tercer grupo.

\) : Paréntesis de cierre para lo anterior.

La introducción de python a regex es bastante buena, y es posible que desee pasar una tarde revisándolo http://docs.python.org/library/re.html#module-re . También, marque Dive Into Python, que tiene una introducción amigable: http://diveintopython3.ep.io /regular-expressions.html .

EDITAR: vea zacherates a continuación, quién tiene algunas ediciones agradables. ¡Dos cabezas son mejores que una!

Otros consejos

Las expresiones regulares son una gran solución para este problema:

>>> import re
>>> s  = 'Michael Schenker Group (House of Blues Dallas 3/26'
>>> re.match(r'(.*) \((.*) (\d+/\d+)', s).groups()
('Michael Schenker Group', 'House of Blues Dallas', '3/26')

Como nota al margen, es posible que desee consultar el Universal Feed Parser para manejar el análisis de RSS como feeds. tiene un mal hábito de ser malformado.

Editar

En lo que respecta a tu comentario ... Las cadenas que de vez en cuando se envuelven en lugar de las de "en lugar de" tienen que ver con el hecho de que estás usando repr. La reproducción de una cadena generalmente se delimita con 's, a menos que esa cadena contenga una o más' s, donde en lugar de eso, use 's' para que no sea necesario escapar de las 's:

>>> "Hello there"
'Hello there'
>>> "it's not its"
"it's not its"

Observe los diferentes estilos de cotización.

Con respecto a la parte de repr (item.title [0: -1]) , no estoy seguro de dónde lo obtuviste, pero estoy bastante seguro de que puedes usar item.title . Todo lo que estás haciendo es eliminar el último carácter de la cadena y luego llamar a repr () , lo que no hace nada.

Tu código debería tener este aspecto:

import geocoders # from GeoPy
us = geocoders.GeocoderDotUS()

import feedparser # from www.feedparser.org
feedurl = "http://www.tourfilter.com/dallas/rss/by_concert_date"
feed = feedparser.parse(feedurl)

lines = []
for entry in feed.entries:
    m = re.search(r'(.*) \((.*) (\d+/\d+)\)', entry.title)  
    if m:
        bandRaw, venue, date = m.groups()

        if band == bandRaw:
            place, (lat, lng) = us.geocode(venue + ", Dallas, TX")
            lines.append(",".join([band, venue, date, lat, lng]))

result = "\n".join(lines)

EDIT : reemplazó list con lines como el nombre var. list es una función integrada y no debe utilizarse como nombre de variable. Lo siento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top