Question

J'essaie d'analyser la balise de titre d'un flux RSS 2.0 en trois variables différentes pour chaque entrée de ce flux. Utilisation d’ElementTree, j’ai déjà analysé le flux RSS pour pouvoir imprimer chaque titre [sans le ) ] avec le code ci-dessous:

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

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

J'inclus cela parce que, comme vous pouvez le constater, item.title est un type de données repr (), dont je ne connais pas grand chose.

Un repr (item.title [0: -1]) particulier print dans la fenêtre interactive ressemble à ceci:

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

L'utilisateur sélectionne un groupe et j'espère qu'après avoir analysé chaque item.title en 3 variables (une pour chaque groupe, chaque lieu et la date ... ou éventuellement un tableau ou je ne le fais pas). t know ...) sélectionnez uniquement ceux liés à la bande sélectionnée. Ensuite, ils sont envoyés à Google pour le géocodage, mais c’est une autre histoire.

J'ai vu des exemples de regex et je lis à leur sujet, mais cela semble très compliqué. Est ce Je pensais que quelqu'un ici aurait peut-être une idée de la façon de procéder de manière intelligente. Devrais-je utiliser le module re ? Est-il important que la sortie soit actuellement est repr () s? Y a-t-il un meilleur moyen? Je pensais utiliser une boucle du type (et ceci est mon pseudoPython, juste le genre de notes que j'écris):

     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  

À la fin, je dois avoir les entrées choisies dans un fichier .csv (délimité par des virgules) ressemblant à ceci:

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

J'espère que ce n'est pas trop demander. Je vais me renseigner moi-même, je pensais juste que je devrais poster ici pour être sûr d'avoir obtenu une réponse

La question est donc de savoir comment mieux analyser chaque repr (item.title [0: -1]) du fil dans les 3 valeurs distinctes Je peux ensuite concaténer dans un fichier .csv?

Était-ce utile?

La solution

Ne laissez pas regex vous effrayer ... ça vaut la peine d'apprendre.

Étant donné les exemples ci-dessus, vous pouvez essayer de replacer la dernière parenthèse, puis d'utiliser ce modèle:

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

Pour accéder à chaque groupe, appelez-le simplement dans l'objet 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"

Dans ce cas, la difficulté avec regex est de vous assurer que vous connaissez tous les caractères possibles connus du titre. S'il y a des caractères non-alpha dans la partie "Michael Schenker Group", vous devrez ajuster l'expression régulière de cette partie pour les autoriser.

Le modèle ci-dessus se décompose comme suit et est analysé de gauche à droite:

([\ w \ s] +) : correspond à tout mot ou espace (le symbole plus indique qu'il doit y avoir un ou plusieurs de ces caractères). Les parenthèses signifient que la correspondance sera capturée en tant que groupe. C’est le groupe "Michael Schenker". partie. S'il peut y avoir des chiffres et des tirets ici, vous voudrez modifier les morceaux entre les crochets, qui sont les caractères possibles pour l'ensemble.

\ (: parenthèse littérale. La barre oblique inversée échappe à la parenthèse, sinon elle compte comme une commande regex. C'est la partie "(" de la chaîne ".

([\ w \ s] +) : identique à celui ci-dessus, mais cette fois correspond au " House of Blues Dallas " partie. Entre parenthèses, ils seront donc capturés en tant que deuxième groupe.

(\ d + / \ d +) : Fait correspondre les chiffres 3 et 26 avec une barre oblique au milieu. Entre parenthèses, ils seront donc capturés en tant que troisième groupe.

\) : Parenthèse de fermeture pour ce qui précède.

L’introduction en python dans regex est plutôt bonne et vous voudrez peut-être y passer une soirée http://docs.python.org/library/re.html#module-re . Consultez également Dive Into In Python, qui contient une introduction conviviale: http://diveintopython3.ep.io. /regular-expressions.html .

EDIT: Voir zacherates ci-dessous, qui a de bonnes modifications. Deux têtes valent mieux qu'une!

Autres conseils

Les expressions régulières sont une excellente solution à ce problème:

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

En guise de remarque, vous voudrez peut-être consulter le analyseur de flux universel pour gérer l'analyse RSS en tant que flux. avoir la mauvaise habitude d'être mal formé.

Modifier

En ce qui concerne votre commentaire ... Les chaînes sont parfois entourées de "s" plutôt que de ce qui est lié au fait que vous utilisez repr. La repr d'une chaîne est généralement délimitée par le caractère ', à moins que cette chaîne ne contienne un ou plusieurs', elle utilise plutôt le caractère '' de sorte que le 'ne doit pas être échappé:

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

Notez les différents styles de citation.

En ce qui concerne la partie repr (item.title [0: -1]) , vous ne savez pas vraiment d'où vous venez cela, mais je suis certain que vous pouvez simplement utiliser item.title . Tout ce que vous faites est de supprimer le dernier caractère de la chaîne, puis d'appeler repr () dessus, ce qui ne fait rien.

Votre code devrait ressembler à quelque chose comme ceci:

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 : a remplacé la liste par lignes en tant que nom de variable. list est une commande intégrée et ne doit pas être utilisée comme nom de variable. Désolé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top