[PYTHON] Um Fehlerbehandlung von 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 () gibt feedparser.FeedParserDict unabhängig von der angegebenen URL zurück. Das ist etwas unpraktisch, deshalb habe ich beschlossen, mir den Inhalt anzusehen.

Wonach schauen

Variable Informationen

Variablennamen URL
resp1 http://qiita.com/tags/python/feed Gewöhnlicher RSS-Feed
resp2 http://qiitta.com/tags/python Kein RSS-Feed
resp3 http://qiita.com/tags/python1/feed Statuscode anders als 200
resp4 http://qiitta.com/tags/python/feed Nicht vorhandene Domain

Ziel

Versuche es herauszufinden

Untersuche den Schlüssel

>>> 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'])
>>> 

Unerwartet sind die Tasten, die ich halte, unterschiedlich. Nur "Bozo" und "Einträge" sind üblich.

Inhalt der allgemeinen Schlüssel

>>> resp1.bozo
0
>>> resp1.entries
[{'summary': '<p>Kapitel 8 beschreibt das grafische Modell. Ein grafisches Modell ist eine Methode zum grafischen Ausdrücken von Beziehungen wie stochastischen Variablen und Modellparametern.
#Abkürzung
}]
>>> 
>>> resp2.bozo
1
>>> resp2.version
''
>>> resp2.entries
[]
>>>
>>> resp3.bozo
1
>>> resp3.version
''
>>> resp3.entries
[]
>>>
>>> resp4.bozo
1
>>> resp4.entries
[]
>>>

Zu diesem Zeitpunkt kann nur dann, wenn ** bozo 0 ist, davon ausgegangen werden, dass der RSS-Feed erfolgreich analysiert wurde **.

Wenn Sie sich nur den ursprünglichen Hauptzweck ansehen, ist dieser fast vollständig, aber lassen Sie uns etwas tiefer gehen.

Siehe die Struktur des Perth-Versagens

Sie können mit "Einträgen" spielen, ohne über das Ergebnis einer erfolgreichen Analyse nachzudenken. Von nun an werde ich prüfen, welche Informationen zum Zwecke der Fehlerbehandlung bei Analysefehlern abgerufen werden können.

Existenz von bozo_exception

Wenn Sie resp1 und resp2 vergleichen, sehen Sie HTTP-ähnliche Schlüssel wie "status" und "headers", wahrscheinlich weil beide Anforderungen erfolgreich waren. Inzwischen gab es einen Schlüssel, der nur in resp2 existiert. Das ist bozo_exception.

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

Es enthielt diese anständige Nachricht. Betrachtet man dies, so scheint es fast kein Problem zu geben.

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'),)
>>>

Wenn man sich andere Antworten ansieht, sieht es so aus. Der Nachteil ist, dass es schwierig ist, nur die darin enthaltene Zeichenfolge auszugeben. Außerdem versucht resp3 trotz 404 Not Found zu analysieren. Wenn Sie also einen Status haben, ist es eine gute Idee, sich diesen ebenfalls anzusehen.

Recommended Posts

Um Fehlerbehandlung von Feedparser
Fehlerbehandlung im Hauptrahmen
Python-Fehlerbehandlung
django.db.migrations.exceptions.InconsistentMigrationHistory Fehlerbehandlung
Über tweepy Fehlerbehandlung
Fehlerbehandlung in PythonBox
GraphQL (gqlgen) Fehlerbehandlung
Reaktion auf Fehler bei der Installation von mecab-python
Memorandum zur Fehlerbehandlung bei PyCUDA-Builds
Fehler geteilt durch 0 Behandlung von ZeroDivisionError
Fehlerbehandlung beim Aktualisieren der Fischschale
Fehlerbehandlung während der Django-Migration 'DIRS': [BASE_DIR / 'Templates']