Вопрос

Я пытаюсь проанализировать тег заголовка в канале RSS 2.0 на три разные переменные для каждой записи в этом канале.Используя ElementTree, я уже проанализировал RSS, чтобы можно было распечатать каждый заголовок [без завершающего )] с помощью кода ниже:

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

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

Я включил это, потому что, как вы можете видеть, item.title — это тип данных repr(), о котором я мало что знаю.

Особый repr(item.title[0:-1]) printed в интерактивном окне выглядит так:

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

Пользователь выбирает полосу и надеюсь, после разбора каждой item.title на 3 переменные (по одной для группы, места проведения и даты...или, возможно, массив, или я не знаю...) выберите только те, которые относятся к выбранной полосе.Потом они отправляются в Google на геокодирование, но это уже другая история.

Я видел несколько примеров regex и я читаю о них, но это кажется очень сложным.Это?Я подумал, может быть, кто-нибудь здесь сможет понять, как именно это сделать разумным способом.Должен ли я использовать re модуль?Имеет ли значение, что вывод в настоящее время repr()с?Есть ли способ лучше?Я думал, что буду использовать такой цикл (и это мой псевдоПитон, просто заметки, которые я пишу):

     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  

В конце концов, мне нужно, чтобы выбранные записи в файле .csv (с разделителями-запятыми) выглядели следующим образом:

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

Надеюсь, это не слишком большая просьба.Я разберусь с этим самостоятельно, просто подумал, что мне следует опубликовать здесь, чтобы убедиться, что на него ответили.

Итак, вопрос в том, как мне лучше всего проанализировать каждый repr(item.title[0:-1]) в feed на три отдельных значения, которые затем можно объединить в файл .csv?

Это было полезно?

Решение

Не позволяйте регулярному выражению вас отпугнуть...этому стоит научиться.

Учитывая приведенные выше примеры, вы можете попробовать вернуть закрывающую скобку, а затем использовать этот шаблон:

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

Чтобы связаться с каждой группой индивидуально, просто позвоните им по 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"

В этом случае самое сложное в регулярном выражении — убедиться, что вы знаете все известные возможные символы в заголовке.Если в части «Группа Майкла Шенкера» есть символы, не являющиеся буквами, вам придется настроить регулярное выражение для этой части, чтобы разрешить их.

Приведенный выше шаблон разбивается следующим образом: он анализируется слева направо:

([\w\s]+) :Сопоставьте любое слово или пробельные символы (символ плюса указывает, что таких символов должен быть один или несколько).Круглые скобки означают, что совпадение будет зафиксировано как группа.Это часть «Группы Майкла Шенкера».Если здесь могут быть цифры и тире, вам нужно будет изменить части в квадратных скобках, которые являются возможными символами для набора.

\( :Буквальная скобка.Обратная косая черта выходит за скобки, так как в противном случае она считается командой регулярного выражения.Это "(" часть строки.

([\w\s]+) :То же, что и выше, но на этот раз соответствует части «Дома Блюза Далласа».В скобках, чтобы они были включены во вторую группу.

(\d+/\d+) :Соответствует цифрам 3 и 26 с косой чертой посередине.В скобках, чтобы они были включены в третью группу.

\) :Закрывающая скобка для вышесказанного.

Введение в регулярное выражение в Python довольно хорошее, и, возможно, вам захочется потратить на его изучение целый вечер. http://docs.python.org/library/re.html#module-re.Также проверьте Dive Into Python, в котором есть дружелюбное введение: http://diveintopython3.ep.io/regular-expressions.html.

РЕДАКТИРОВАТЬ:См. Зачератес ниже, у которого есть несколько хороших изменений.Две головы лучше одной!

Другие советы

Регулярные выражения — отличное решение этой проблемы:

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

В качестве примечания, вы можете посмотреть на Универсальный парсер каналов для обработки анализа RSS, поскольку каналы имеют плохую привычку быть искаженными.

Редактировать

Что касается вашего комментария...Строки, которые иногда заключаются в "s", а не в "s", связаны с тем фактом, что вы используете repr.Представление строки обычно ограничивается символом 's, если только эта строка не содержит один или несколько 's', где вместо этого используется 's, чтобы не нужно было экранировать 's':

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

Обратите внимание на разные стили цитат.

Взяв во внимание repr(item.title[0:-1]) часть, не знаю, откуда вы это взяли, но я почти уверен, что вы можете просто использовать item.title.Все, что вы делаете, это удаляете последний символ из строки, а затем вызываете repr() на нем, который ничего не делает.

Ваш код должен выглядеть примерно так:

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)

РЕДАКТИРОВАТЬ:заменены list с lines как имя var. list является встроенной функцией и не может использоваться в качестве имени переменной.Извини.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top