Как сделать так, чтобы Universal Feed Parser анализировал только каналы? - PullRequest
2 голосов
/ 25 декабря 2010

Я пытаюсь получить контент из внешних каналов на своем веб-сайте Django с помощью Универсальный анализатор каналов . Я хочу иметь некоторую пользовательскую обработку ошибок, например если пользователь вводит URL, который не является фидом. Когда я попробовал, как feedparser реагирует на ошибочный ввод, я был удивлен, увидев, что feedparser вообще не выдает никаких исключений. Например. для содержимого HTML он пытается проанализировать некоторую информацию из кода HTML, а для несуществующих доменов он возвращает практически пустой словарь:

{'bozo': 1,
'bozo_exception': URLError(gaierror(-2, 'Name or service not known'),),
'encoding': 'utf-8',
'entries': [],
'feed': {},
'version': None}

Другие ошибочные входные данные проявляются в значениях status_code или namespaces в возвращаемом словаре.

Итак, каков наилучший подход к проверке вменяемых ошибок, не прибегая к бесконечному каскаду if .. elif .. elif ...?

1 Ответ

5 голосов
/ 25 декабря 2010

Согласно документации feedparser, в разделе Обнаружение бозо :

Универсальный анализатор каналов может анализировать каналы независимо от того, являются ли они правильно сформированными XML или нет.Однако, поскольку некоторые приложения могут захотеть отклонить или предупредить пользователей о неправильно сформированных каналах, Universal Feed Parser устанавливает бит бозо, когда обнаруживает, что канал имеет неправильную форму.

(ВНа мой взгляд, не очень хорошая практика перехватывать все исключения и возвращать их в другой форме, но это так, как это работает, поскольку «приложения могут просто предупреждать о неправильно сформированных каналах».)

Итакпосле попытки проанализировать фид по любому URL, вы можете проверить «бит bozo» и повторно вызвать соответствующее исключение:

f = feedparser.parse('http://example.com')
if f.bozo:
    raise f.bozo_exception

Вы можете обработать исключение в соответствии с типом и сообщением, илиделая утверждения для других атрибутов объекта, возвращаемого feedparser.parse (например: f.feed должен быть непустым, f.status должен быть равен 200, f.entries должен быть непустым, f.version должен быть действительнымверсия в формате ленты и т. д.) - все, что кажется наиболее приемлемым для вашего приложения.

...