Уведомления

Группа в Telegram: @pythonsu

#1 Май 10, 2012 19:42:15

Kane
Зарегистрирован: 2012-04-19
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг атом фида

Привет, расковыриваю фид рутрекера. По доке начудил такое (3.2.3):

import xml.dom.minidom
dom = xml.dom.minidom.parse('feed1.xml')
rel = []
for release in dom.getElementsByTagName('title'):
	title = release.toxml()
	title = title.replace('<title type="html"><![CDATA', '')
	title = title.replace('></title>', '')
	rel.append(title)
for x in rel:
	print(x, '\n')

Таким макаром получаю из фида заголовки раздач, например:
[Помни / Память / Мементо / Memento (Кристофер Нолан /Christopher Nolan) [2000, США, Триллер, криминал, детектив, BDRip 1080p] [10th Anniversary Special Edition] Dub+MVO+DVO+AVO+Ukr+Orig(Eng)+Sub(Rus,Eng) [21.78 GB]]] 

[Цыплёнок с черносливом / Poulet aux prunes / Chicken with plums (Венсан Паронно / Vincent Paronnaud, Маржан Сатрапи / Marjane Satrapi) [2011, Франция, Германия, Бельгия, драма, BDRip 1080p] Sub (rus, fre (forced)) + original (fre) [6.56 GB]]]

[Застрял в тебе / Stuck on You (Бобби Фаррелли, Питер Фаррелли / Bobby Farrelly, Peter Farrelly) [2003 г., США, комедия, драма, HDTV 1080i] DUB + DVO + original eng + sub rus, eng [9.6 GB]]]

Собственно теперь хотелось бы разобрать эти заголовки, например выдернуть названия, режиссёра, размер, и т.д.
Правила создания раздач довольно строгие, поэтому для себя вижу банальный вариант - пробежаться циклом по каждому символу, нужные куда-нибудь записать, и сделать срез от, например, [ до (
В общем, прошу дать наводку, куда копать.

ps Пытаюсь читать талмуд Фридла по регуляркам, но как-то туго пока понимание приходит.

Отредактировано Kane (Май 10, 2012 19:52:53)

Офлайн

#2 Май 11, 2012 11:31:42

dehun
От: Ukraine::Kiev
Зарегистрирован: 2012-04-25
Сообщения: 26
Репутация: +  3  -
Профиль   Отправить e-mail  

Парсинг атом фида

ненадо циклом по каждому символу.
попробуй таки разобратся с регулярками - сушествено упрошяет жизнь с парсингом текста.

Офлайн

#3 Май 11, 2012 13:02:52

dehun
От: Ukraine::Kiev
Зарегистрирован: 2012-04-25
Сообщения: 26
Репутация: +  3  -
Профиль   Отправить e-mail  

Парсинг атом фида

я парсил самый первый тайтл. если структура одинаковая то вроде как должно подойти и всему остальному

import re
re.search('^\[(.+?) \((.+?)\) \[(.+?)\] \[(.+?) \[(.+?)\]', text).group(5)
в последнем методе group попробуй поменять циферки - там разные части.

Офлайн

#4 Май 12, 2012 20:56:24

Kane
Зарегистрирован: 2012-04-19
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг атом фида

Попробовал, регулярка работает, с циферками понял что к чему. Осилил четверть книжки, условно сообразил, что и как она делает. Правда результат мне нужен чуть точнее, но тут я уже разберусь.
Спасибо за помощь!

Офлайн

#5 Май 13, 2012 12:48:35

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Парсинг атом фида

Фридл написал свой талмуд немного под другой случай. Он там как бы даёт более_глубокое_понимание_регулярных_выражний. А для решение обычной задачи отлично подходит документация к модулю re в пару страниц. Советую Фридла читать для удовольствия и общего развития, а для решения задач просто посматривать в доки.



Офлайн

#6 Май 13, 2012 13:32:15

Kane
Зарегистрирован: 2012-04-19
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг атом фида

fata1ex, у меня после прочтения доки понимания, куда там коней запрягают не появилось, к сожалению.

fata1ex
Он там как бы даёт более_глубокое_понимание_регулярных_выражний.
А вместе с тем начинает с малого и всё объясняет на примерах. Очень приятно

fata1ex
Советую Фридла читать для удовольствия и общего развития
Кстати, получается что так и делаю. Пишет он очень грамотно и интересно (сужу по переводу изд-ва символ), можно читать как худ. лит. перед сном

Офлайн

#7 Май 13, 2012 13:39:36

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Парсинг атом фида

Ну чтож, каждому своё :) Хуже от прочтения хорошей книги точно не станет. Удачи в освоении.



Офлайн

#8 Май 13, 2012 15:16:07

Kane
Зарегистрирован: 2012-04-19
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг атом фида

Спасибо.
И вопрос вдогонку: в регулярки умеют что-то типа условий?
Например в начале заголовка в квадратных скобках может быть доп.информация, вот если есть, то его выкинуть. Regexp`ом такое реально описать?


Насколько я разобрался, просто проверить наличие в начале чего-нибудь в кв. скобках можно так:
Пример куска заголовка:

[[Обновлено] Воин / Warrior (Гэвин О’Коннор / Gavin O&#039;Connor)
re.search('^\[\[(.+?)\]', x)
Проверяется наличие открывающей квадратной скобки (закрывается она в самом конце заголовка), за ней ещё одна ‘[’, а потом она закрывается. А внутри куча возможно существующих символов.
Такая проверка кажется тоже подходит:
re.search('^\[\[', x)
Или например, в середине заголовка тоже в квадратных скобках может быть информация об издании (как в оп посте, в первом примере; режиссёрская версия, театральная и т.п.)
re.search('\].+?\[(.+?).+?\[', y)

Отредактировано Kane (Май 13, 2012 15:56:46)

Офлайн

#9 Май 13, 2012 15:32:18

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Парсинг атом фида

С помощью регулярок Python'a почти невозможно парсить вложенные структуры:
google://python regex nested

Офлайн

#10 Май 13, 2012 15:32:44

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Парсинг атом фида

Не очень понятно в чем вопрос, если вы сами на него ответили.

Например в начале заголовка в квадратных скобках может быть доп.информация, вот если есть, то его выкинуть.
Выкинуть заголовок или информацию? Если заголовок, то вы вроде сами написали - ищем подходящее вхождение, если находим, значит он нам не подходит. Если нужно выкинуть информацию, то просто пропускаем её или считываем, но не используем, например, так:
>>> m = re.search('\[.*?\] (?P<num>\d*)', '[ bla bla ] 12345')
>>> m.group('num')
'12345'



Отредактировано fata1ex (Май 13, 2012 15:33:08)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version