Pergunta

Eu estou tentando analisar o título de tag em um feed RSS 2.0 em três variáveis ??diferentes para cada entrada nesse feed. Usando ElementTree eu já analisado o RSS para que eu possa imprimir cada título [com excepção do arrasto )] com o código abaixo:

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

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

incluo isso porque, como você pode ver, o item.title é um tipo de dados repr (), que eu não sei muito sobre isso.

A repr(item.title[0:-1]) especial printed na janela aparência interativos como esta:

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

O usuário seleciona uma banda e espero, depois de analisar cada item.title em 3 variáveis ??(um para cada banda, local e data ... ou possivelmente uma matriz ou eu não sei ...) apenas aqueles seleccionar relacionada com a banda selecionada. Em seguida, eles são enviados para o Google para geocodificação, mas isso é outra história.

Eu vi alguns exemplos de regex e eu estou lendo sobre eles, mas parece muito complicado. É isso? Eu pensei que talvez alguém aqui teria alguma introspecção a respeito de exatamente como fazer isso de uma forma inteligente. Devo usar o módulo re? Importa que a saída é, atualmente, é repr()s? Existe uma maneira melhor? Eu estava pensando que eu usaria um loop como (e esta é a minha pseudoPython, apenas um tipo de notas que eu estou escrevendo):

     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  

No final, eu preciso ter as entradas escolhidas em um arquivo .csv (delimitado por vírgula) de arquivo parecido com isto:

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 isso não é pedir demais. Eu vou estar olhando para isso no meu próprio, apenas pensei que eu deveria postar aqui para se certificar de que foi respondida.

Assim, a pergunta é: como faço para melhor analisar cada repr(item.title[0:-1]) na feed nos valores separados 3 que eu posso então concatenar em um arquivo .csv?

Foi útil?

Solução

Do not deixar regex assustá-lo fora ... vale a pena aprender.

Tendo em conta os exemplos acima, você pode tentar colocar a volta à direita parêntese, e em seguida, usando esse padrão:

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 chegar a cada indivíduo grupo, basta chamá-los no 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"

A coisa difícil sobre regex neste caso é ter certeza que você sabe todos os conhecidos personagens possíveis no título. Se houver caracteres não-alfa em parte do 'Grupo Schenker Michael', você vai ter que ajustar o regex para essa parte para permitir que eles.

O padrão acima tem a seguinte composição, que é analisado esquerda para a direita:

([\w\s]+): Combinar qualquer palavra ou caracteres de espaço (o símbolo de adição indica que deve haver um ou mais desses caracteres). Os parênteses significam que o jogo será capturado como um grupo. Esta é a parte "Michael Schenker Group". Se não pode haver números e traços aqui, você vai querer modificar as peças entre os colchetes, que são os possíveis caracteres para o set.

\(: Um parêntese literal. A barra invertida escapa o parêntese, pois caso contrário ele conta como um comando regex. Este é o "(" parte da string.

([\w\s]+): O mesmo que o descrito acima, mas desta vez coincide com a parte "House of Blues Dallas". Em parênteses para que eles serão capturados como o segundo grupo.

(\d+/\d+): Combina os dígitos 3 e 26 com uma barra no meio. Em parênteses para que eles serão capturados como o terceiro grupo.

\):. Fechando parêntese para o acima

A introdução python para regex é muito bom, e você pode querer passar uma noite indo sobre ele http://docs.python.org/library/re.html#module-re . Além disso, verifique Dive Into Python, que tem uma introdução amigável: http://diveintopython3.ep.io /regular-expressions.html .

EDIT: Veja zacherates abaixo, que tem algumas edições agradáveis. Duas cabeças pensam melhor do que uma!

Outras dicas

As expressões regulares são uma ótima solução 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 uma nota lateral, você pode querer olhar para o Universal de alimentação Analisador para lidar com a análise RSS como feeds têm o mau hábito de ser mal formado.

Editar

Em relação ao seu comentário ... As cordas ocasionalmente ser envolvido em "s, em vez de 's tem a ver com o fato de que você está usando repr. A repr de uma string é geralmente delimitados por' s, a menos que cadeia contém um ou mais 's, onde em vez disso, usa "é para que os 's não tem que ser escapado:

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

Observe os diferentes estilos de cotação.

Com relação à parte repr(item.title[0:-1]), não sei onde você conseguiu tudo isso, mas eu tenho certeza que você pode simplesmente usar item.title. Tudo o que você está fazendo é remover o último caractere da seqüência e, em seguida, chamando repr() sobre ele, que não faz nada.

O código deve ser algo como isto:

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)

Editar : list substituído por lines como o nome var. list é um builtin e não deve ser usado como um nome de variável. Desculpe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top