Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2010 13:29:35

Mutagena
От:
Зарегистрирован: 2009-10-18
Сообщения: 295
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсить rss-ленту сайта.

Подскажите, как необходимо организовать парсинг rss-ленты сайта.
Как я поняла, мне необходимо открыть файл, считать содержимое, преобразовать в json-объект, а потом уже работать с ним.
Подскажите, как мне нужно правильно всё это сделать? Желательно, с примерами.



Офлайн

#2 Янв. 17, 2010 13:35:18

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Парсить rss-ленту сайта.

эээ… json тут вообще не причем.
Взгляните на модуль feedparser, на этой же странице найдете пример.



Офлайн

#3 Янв. 17, 2010 13:44:46

Mutagena
От:
Зарегистрирован: 2009-10-18
Сообщения: 295
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсить rss-ленту сайта.

igor.kaist, от установки дополнительных модулей необходимо отказаться, так как скрипт будет работать в определённом окружении.
Пишу вот так для открытия файла:

from StringIO import StringIO
site = open(f_site.rss_feed, 'r')
Свойство rss_feed объекта f_site содержит адрес рсс-ленты. Например, http://www.free-lance.ru/rss/all.xml
Но получаю ошибку (22, “invalid mode ('r') or filename”)



Офлайн

#4 Янв. 17, 2010 13:49:19

Jenyay
От:
Зарегистрирован: 2007-08-10
Сообщения: 173
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсить rss-ленту сайта.

open не может открывать файлы в интернете, для этого используйте urllib или urllib2.

Для парсинга RSS можете использовать xml.dom.minidom. А вообще посмотрите модуль xml.dom.



Офлайн

#5 Янв. 18, 2010 14:09:00

Mutagena
От:
Зарегистрирован: 2009-10-18
Сообщения: 295
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсить rss-ленту сайта.

Использую модули urllib и xml.dom.minidom для парсинга рсс.
Делаю вот так:

from xml.dom.minidom import *
import urllib
...
freelance_site = FreelanceSite.objects.get(id=1)
fh = urllib.urlopen(freelance_site.rss_feed)
fh = fh.read()
site_dom = parseString(str(fh))
site_title = getText(site_dom.getElementsByTagName("title")[0].childNodes)
site_list = site_dom.getElementsByTagName("item")
projects = []
for site in site_list:
title = getText(site.getElementsByTagName("title")[0].childNodes)
link = getText(site.getElementsByTagName("link")[0].childNodes)
description = getText(site.getElementsByTagName("description")[0].childNodes)
category = getText(site.getElementsByTagName("category")[0].childNodes)
pub_date = getText(site.getElementsByTagName("pubDate")[0].childNodes)
projects.append({'title': title, 'link': link, 'description': description, 'category':category, 'pub_date': pub_date})
site_dom.unlink()
Но возникает проблема. Некоторые теги выглядят так:
<title><![CDATA[Копирайтер сайта Free-lance.ru]]></title> 
<description><![CDATA[Приглашаем на постоянную удаленную работу копирайтера – 4 часа в день/5 дней в неделю.]]></description>
Как нужно поступать в таких случаях?



Офлайн

#6 Янв. 18, 2010 17:09:19

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Парсить rss-ленту сайта.

Все так же. Если я ничего не путаю, CDATA попадет в CDATASection точно так же, как и text. Ваш getText должен сработать.
К слову, гадость этот minidom. lxml.etree и особенно lxml.objectify имеют на порядок более вменяемый интерфейс.



Офлайн

#7 Янв. 18, 2010 20:30:12

Mutagena
От:
Зарегистрирован: 2009-10-18
Сообщения: 295
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсить rss-ленту сайта.

Всё, разобралась.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version