2009-06-20 6 views
1

Похоже, что http://portland.beerandblog.com/feed/atom/ испорчен (как и RSS-каналы 0.92 и 2.0).Неполадка получения даты с помощью универсального анализатора подачи

Универсальный пул подачи (последняя версия от http://code.google.com/p/feedparser/source/browse/trunk/feedparser/feedparser.py?spec=svn295&r=295) не видит никаких дат.

<title>Beer and Blog Portland</title> 
    <atom:link href="http://portland.beerandblog.com/feed/" rel="self" type="application/rss+xml" /> 
    <link>http://portland.beerandblog.com</link> 
    <description>Bloggers helping bloggers over beers in Portland, Oregon</description> 
    <pubDate>Fri, 19 Jun 2009 22:54:57 +0000</pubDate> 
    <generator>http://wordpress.org/?v=2.7.1</generator> 
    <language>en</language> 
    <sy:updatePeriod>hourly</sy:updatePeriod> 
    <sy:updateFrequency>1</sy:updateFrequency> 
        <item> 
      <title>Widmer is sponsoring our beer for the After Party!!</title> 
      <link>http://portland.beerandblog.com/2009/06/19/widmer-is-sponsoring-our-beer-for-the-after-party/</link> 
      <comments>http://portland.beerandblog.com/2009/06/19/widmer-is-sponsoring-our-beer-for-the-after-party/#comments</comments> 
      <pubDate>Fri, 19 Jun 2009 22:30:35 +0000</pubDate> 
      <dc:creator>Justin Kistner</dc:creator> 

      <category><![CDATA[beer]]></category> 

Я пытаюсь

 
     try: 
      published = e.published_parsed 
     except: 
      try: 
       published = e.updated_parsed 
      except: 
       published = e.created_parsed 

и терпит неудачу, потому что я не могу получить дату.

Любые мысли о том, как извлечь дату разумным образом?

Спасибо!

+0

Ссылка, которую вы указали, имеет этот тег, 2009-06-19T22: 54: 57Z, который при анализе (updated_parsed) дает этот Python 9-кортеж: (2009, 6, 19, 22, 54, 57, 4 , 170, 0), который, как представляется, является разумным способом для извлечения даты. – bernie

+0

Спасибо за ответ. Я ничего не получаю от d.updated_parsed. Я получаю d.modified Проблема в том, что для всего фида, а не для конкретных записей. С течением времени это, вероятно, имеет меньшее значение: я не делаю ничего в режиме реального времени, и новые статьи должны быть более или менее одинаковыми с самим каналом. – jdeibele

+0

Тестирование, я получаю d.updated, но не d.updated_parsed. Что странно, поскольку http://www.feedparser.org/docs/reference-feed-updated.html говорит: «Этот элемент анализируется как дата и сохраняется в файле feed.updated_parsed». – jdeibele

ответ

1

Использование голой except может маскировать проблему в вашем коде. Предполагая, что (я не использую корм парсеров), что AttributeError является конкретным исключением, которое вы должны проверять, попробуйте (случайный каламбур) это:

try: 
    published = e.published_parsed 
except AttributeError: 
    try: 
     published = e.updated_parsed 
    except AttributeError: 
     published = e.created_parsed 

В любом случае, вместо того, чтобы «это провал», пожалуйста, покажите сообщение об ошибке и трассировку.

Редактировать Я загрузить последнюю версию (т.е. не из СВН) и последовал примеру в Документах с этим результатом:

C:\feedparser>\python26\python 
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on 
win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import feedparser 
>>> d = feedparser.parse('http://portland.beerandblog.com/feed/atom/') 
>>> d.entries[0].updated 
u'2009-06-19T22:54:57Z' 
>>> d.entries[0].updated_parsed 
time.struct_time(tm_year=2009, tm_mon=6, tm_mday=19, tm_hour=22, tm_min=54, tm_sec=57, tm_wday=4, tm_yday=170, tm_isdst=0) 
>>> d.entries[0].title 
u'Widmer is sponsoring our beer for the After Party!!' 
>>> d.entries[0].published 
u'2009-06-19T22:30:35Z' 
>>> d.entries[0].published_parsed 
time.struct_time(tm_year=2009, tm_mon=6, tm_mday=19, tm_hour=22, tm_min=30, tm_sec=35, tm_wday=4, tm_yday=170, tm_isdst=0) 
>>> 

Как я уже сказал, я не в RSS и Атомы и тому подобное, но для меня это кажется довольно простым. Кроме того, что я не понимаю, откуда вы получаете теги <pubDate> и временные метки в стиле арпане; AFAICT, что нет в исходном источнике - он имеет <published> и ISO временные метки:

>>> import urllib 
>>> guff = urllib.urlopen('http://portland.beerandblog.com/feed/atom/').read() 
>>> guff.find('pubDate') 
-1 
>>> guff.find('published') 
1171 
>>> guff[1160:1200] 
'pdated>\n\t\t<published>2009-06-19T22:30:35' 
>>> 

Что ваш «е» в «e.published_parsed»? Подумайте о том, чтобы показать полную историю с доступом к feedparser, как я сделал выше.

+0

Вы, безусловно, правы в определении ошибки, которую я ищу, и я пошел дальше и сделал это сейчас. Благодарю. Проблема, с которой я столкнулась, состоит в том, что всех трех из них не существует. Из документации по адресу http://www.feedparser.org/ Я бы ожидал, что e.published_parsed будет работать, а другие - не так много. В этом блоге работает WordPress 2.71, что довольно актуально. Что меня беспокоит, так это то, что feedparser явно не видит различную статью «pubDate», которая находится в фиде. http://pastebin.com/m1c614fce имеет журнал того, что видит feedparser. – jdeibele

3

работает для меня:

>>> e = feedparser.parse('http://portland.beerandblog.com/feed/atom/') 
>>> e.feed.date 
u'2009-06-19T22:54:57Z' 
>>> e.feed.date_parsed 
(2009, 6, 19, 22, 54, 57, 4, 170, 0) 
>>> e.feed.updated_parsed 
(2009, 6, 19, 22, 54, 57, 4, 170, 0) 

Может быть, вы ищете e.updated_parsed, где вы должны искать e.feed.updated_parsed вместо этого?