Recuperare con grazia dall'errore di analisi in espatrio
-
28-10-2019 - |
Domanda
XML dovrebbe essere severo, e quindi ci sono alcuni caratteri Unicode che non sono ammessi in XML. Tuttavia, sto cercando di lavorare con feed RSS che spesso contengono comunque questi personaggi, e vorrei evitare errori di analisi da personaggi non validi o recuperare con grazia da loro e presentare comunque il documento.
Vedi un esempio qui (il 21 marzo comunque): http://feeds.feedburner.com/chrisblattman
Qual è il modo consigliato per gestire Unicode nel feed XML? Rilevare i caratteri e sostituire in byte null, modificare il parser o qualche altro metodo?
Soluzione
Sembra che il feed RSS contenesse un carattere di scheda verticale \x0c
che è illegale Secondo la specifica XML 1.0.
Il mio consiglio è di filtrare i personaggi illegali prima di passare i dati a espatriare, piuttosto che tentare di catturare errori e recuperare. Ecco una routine per filtrare i personaggi Unicode che sono illegali. L'ho provato sul tuo chrisblattman.xml
RSS Feed:
import re
from xml.parsers import expat
# illegal XML 1.0 character ranges
# See http://www.w3.org/TR/REC-xml/#charsets
XML_ILLEGALS = u'|'.join(u'[%s-%s]' % (s, e) for s, e in [
(u'\u0000', u'\u0008'), # null and C0 controls
(u'\u000B', u'\u000C'), # vertical tab and form feed
(u'\u000E', u'\u001F'), # shift out / shift in
(u'\u007F', u'\u009F'), # C1 controls
(u'\uD800', u'\uDFFF'), # High and Low surrogate areas
(u'\uFDD0', u'\uFDDF'), # not permitted for interchange
(u'\uFFFE', u'\uFFFF'), # byte order marks
])
RE_SANITIZE_XML = re.compile(XML_ILLEGALS, re.M | re.U)
# decode, filter illegals out, then encode back to utf-8
data = open('chrisblattman.xml', 'rb').read().decode('utf-8')
data = RE_SANITIZE_XML.sub('', data).encode('utf-8')
pr = expat.ParserCreate('utf-8')
pr.Parse(data)
Aggiornare: Qui è Una pagina Wikipedia Informazioni sulla validità del carattere XML. Il mio regexp sopra filtra l'intervallo di controllo C1, ma potresti voler consentire quei caratteri a seconda della tua applicazione.
Altri suggerimenti
Puoi provare Bella zuppache possono analizzare i documenti HTML/XML anche se non sono ben formati.