Autour de la gestion des erreurs de feedparser

TL;DR

Motivation

>>> import feedparser
>>> 
>>> resp1 = feedparser.parse('http://qiita.com/tags/python/feed')
>>> type(resp1)
<class 'feedparser.FeedParserDict'>
>>> 
>>> resp2 = feedparser.parse('http://qiita.com/tags/python1/feed')
>>> type(resp2)
<class 'feedparser.FeedParserDict'>

feedparser.parse () renvoie feedparser.FeedParserDict quelle que soit l'URL spécifiée. C'est un peu gênant, alors j'ai décidé de jeter un œil au contenu.

Ce qu'il faut chercher

Informations variables

Nom de variable URL
resp1 http://qiita.com/tags/python/feed Flux RSS ordinaire
resp2 http://qiitta.com/tags/python Pas un flux RSS
resp3 http://qiita.com/tags/python1/feed Code d'état autre que 200
resp4 http://qiitta.com/tags/python/feed Domaine inexistant

Cible

Essayer de trouver

Examinez la clé

>>> resp1.keys()
dict_keys(['bozo', 'encoding', 'status', 'etag', 'href', 'entries', 'version', 'namespaces', 'feed', 'headers'])
>>> 
>>> resp2.keys()
dict_keys(['bozo', 'encoding', 'status', 'bozo_exception', 'etag', 'href', 'entries', 'version', 'namespaces', 'feed', 'headers'])
>>> 
>>> resp3.keys()
dict_keys(['bozo', 'encoding', 'bozo_exception', 'status', 'href', 'entries', 'version', 'namespaces', 'feed', 'headers'])
>>> 
>>> resp4.keys()
dict_keys(['bozo', 'entries', 'feed', 'bozo_exception'])
>>> 

De manière inattendue, les clés que je détiens sont différentes. Seuls les «bozo», les «entrées» sont courants.

Contenu des clés communes

>>> resp1.bozo
0
>>> resp1.entries
[{'summary': '<p>Le chapitre 8 décrit le modèle graphique. Un modèle graphique est une méthode d'expression graphique de relations telles que des variables stochastiques et des paramètres de modèle.
#Abréviation
}]
>>> 
>>> resp2.bozo
1
>>> resp2.version
''
>>> resp2.entries
[]
>>>
>>> resp3.bozo
1
>>> resp3.version
''
>>> resp3.entries
[]
>>>
>>> resp4.bozo
1
>>> resp4.entries
[]
>>>

À ce stade, seulement lorsque ** bozo vaut 0, on peut considérer que le flux RSS a été analysé avec succès **.

Si vous ne regardez que l'objectif principal d'origine, c'est presque terminé, mais creusons un peu plus loin.

Voir la structure de l'échec de Perth

Vous pouvez jouer avec les «entrées» sans penser au résultat d'une analyse réussie, donc à partir de maintenant, j'irai voir quel genre d'informations peuvent être obtenues aux fins de la gestion des erreurs de l'analyse syntaxique.

Existence de bozo_exception

Si vous comparez resp1 et resp2, vous pouvez voir des clés de type HTTP telles que status et headers, probablement parce que les deux requêtes ont abouti. Pendant ce temps, il y avait une clé qui n'existe que dans resp2. C'est «bozo_exception».

>>> resp2.bozo_exception
SAXParseException('undefined entity',)

Il contenait ce message décent. En regardant cela, il semble qu'il n'y ait presque aucun problème.

resp3,resp4


>>> resp3.bozo_exception
NonXMLContentType('text/html; charset=utf-8 is not an XML media type',)
>>>
>>> resp4.bozo_exception
URLError(gaierror(8, 'nodename nor servname provided, or not known'),)
>>>

En regardant les autres réponses, cela ressemble à ceci. L'inconvénient est qu'il est difficile de ne sortir que la chaîne de caractères à l'intérieur. De plus, resp3 essaie d'analyser malgré 404 Not Found, donc si vous avez un statut, c'est une bonne idée de le regarder également.

Recommended Posts

Autour de la gestion des erreurs de feedparser
Gestion des erreurs de trame principale
Gestion des erreurs Python
django.db.migrations.exceptions.InconsistentMigrationHistory Gestion des erreurs
À propos de la gestion des erreurs Tweepy
Gestion des erreurs dans PythonBox
Gestion des erreurs GraphQL (gqlgen)
Réponse aux erreurs lors de l'installation de mecab-python
Mémorandum de gestion des erreurs de construction PyCUDA
Erreur divisée par 0 Gestion de ZeroDivisionError
Gestion des erreurs lors de la mise à jour de Fish shell
Gestion des erreurs lors de la migration de Django'DIRS ': [BASE_DIR /' templates ']