Domanda

Sto cercando di analizzare il tag del titolo in un feed RSS 2.0 in tre diverse variabili per ogni voce in quel feed. Utilizzando ElementTree ho già analizzato l'RSS in modo da poter stampare ogni titolo [meno il ) ] finale con il codice seguente:

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

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

Lo includo perché, come puoi vedere, item.title è un tipo di dati repr (), di cui non so molto.

Un particolare repr (item.title [0: -1]) print ed ed nella finestra interattiva appare così:

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

L'utente seleziona una banda e spero di aver analizzato ogni item.title in 3 variabili (una per banda, luogo e data ... o possibilmente un array o non lo faccio ' t so ...) selezionare solo quelli relativi alla banda selezionata. Quindi vengono inviati a Google per la geocodifica, ma questa è un'altra storia.

Ho visto alcuni esempi di regex e ne sto leggendo, ma sembra molto complicato. È? Pensavo che qualcuno qui avrebbe avuto un'idea di come farlo in modo intelligente. Dovrei usare il modulo re ? È importante che l'output sia attualmente repr () s? Esiste un modo migliore? Stavo pensando di usare un ciclo come (e questo è il mio pseudoPython, solo il tipo di note che sto scrivendo):

     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  

Alla fine, ho bisogno di avere le voci scelte in un file .csv (delimitato da virgole) in questo modo:

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

Spero che questo non sia troppo da chiedere. Lo esaminerò da solo, ho pensato che avrei dovuto pubblicare qui per assicurarmi che ricevessero risposta.

Quindi, la domanda è: come posso analizzare meglio ogni repr (item.title [0: -1]) nel feed nei 3 valori separati che Posso quindi concatenare un file .csv?

È stato utile?

Soluzione

Non lasciare che regex ti spaventi ... vale la pena imparare.

Dati gli esempi precedenti, potresti provare a reinserire la parentesi finale, quindi a utilizzare questo modello:

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')

Per accedere a ciascun individuo del gruppo, chiamali semplicemente sull'oggetto 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"

La cosa difficile di regex in questo caso è assicurarsi di conoscere tutti i possibili personaggi conosciuti nel titolo. Se ci sono caratteri non alfa nella parte "Gruppo Michael Schenker", dovrai adeguare la regex per quella parte per consentirli.

Il modello sopra si scompone come segue, che viene analizzato da sinistra a destra:

([\ w \ s] +) : corrisponde a qualsiasi parola o spazio (il simbolo più indica che dovrebbero esserci uno o più di questi caratteri). Le parentesi indicano che la partita verrà catturata come gruppo. Questo è il "quot. Michael Schenker Group" parte. Se qui possono esserci numeri e trattini, ti consigliamo di modificare i pezzi tra parentesi quadre, che sono i possibili caratteri per il set.

\ (: una parentesi letterale. La barra rovesciata sfugge alla parentesi, poiché altrimenti conta come un comando regex. Questa è la parte " (" della stringa.

([\ w \ s] +) : uguale a quello sopra, ma questa volta corrisponde a " House of Blues Dallas " parte. Tra parentesi verranno catturati come secondo gruppo.

(\ d + / \ d +) : abbina le cifre 3 e 26 con una barra nel mezzo. Tra parentesi verranno catturati come terzo gruppo.

\) : chiusura tra parentesi per quanto sopra.

L'introduzione di Python a regex è abbastanza buona e potresti voler passare una serata passandoci sopra http://docs.python.org/library/re.html#module-re . Inoltre, controlla Dive Into Python, che ha un'introduzione amichevole: http://diveintopython3.ep.io /regular-expressions.html.

MODIFICA: vedi gli zacherati di seguito, che ha delle belle modifiche. Due teste sono meglio di una!

Altri suggerimenti

Le espressioni regolari sono un'ottima soluzione a questo 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')

Come nota a margine, potresti voler guardare il Universal Feed Parser per gestire l'analisi RSS come feed ha una cattiva abitudine di essere malformato.

Modifica

Per quanto riguarda il tuo commento ... Le stringhe di tanto in tanto sono avvolte in "piuttosto che in" hanno a che fare con il fatto che stai usando repr. Il repr di una stringa di solito è delimitato da 's, a meno che quella stringa non contenga uno o più', dove invece usa "quot" in modo che non sia necessario eseguire l'escaping di "

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

Nota i diversi stili di citazione.

Per quanto riguarda la parte repr (item.title [0: -1]) , non sono sicuro da dove l'hai preso, ma sono abbastanza sicuro che puoi semplicemente usare item.title . Tutto quello che stai facendo è rimuovere l'ultimo carattere dalla stringa e quindi chiamare repr () , che non fa nulla.

Il tuo codice dovrebbe assomigliare a questo:

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 : sostituito list con righe come nome var. list è un builtin e non deve essere usato come nome di variabile. Siamo spiacenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top