Unicode et UTF-8 problème de codage avec Scrapy XPath sélecteur de texte
Je suis l'aide de Scrapy et Python (dans le cadre d'un projet Django) pour gratter un site allemand de contenu. J'ai libxml2
installé comme backend pour Scrapy sélecteurs.
Si je récupérer le mot 'Hüftsitz'
(c'est la façon dont il est affiché sur le site) à travers des sélecteurs, j'obtiens: u'H\ufffd\ufffdftsitz'
(Scrapy XPath sélecteurs de retour des chaînes Unicode).
Si j'encode en UTF-8
, j'obtiens: 'H\xef\xbf\xbd\xef\xbf\xbdftsitz'
. Et si j'ai l'impression que j'arrive 'H??ftsitz'
qui n'est pas correct. Je me demande pourquoi cela pourrait se produire.
La character-set
sur le site est mis à UTF-8
. Je suis en train de tester le dessus sur l'interface Python avec sys.getdefaultencoding
ensemble de UTF-8
. À l'aide de l'application Django là où les données XPath sélecteurs est écrit dans une base de données MySQL avec UTF-8
jeu de caractères, je vois le même comportement.
Suis-je surplombant quelque chose d'évident ici? Tout d'indices ou de l'aide sera grandement appréciée.
OriginalL'auteur ayaz | 2011-04-11
Vous devez vous connecter pour publier un commentaire.
u'\ufffd' est le "unicode caractère de remplacement", qui est habituellement indiqué par un point d'interrogation à l'intérieur d'un triangle noir. PAS un u tréma. Donc, le problème doit être quelque part en amont. Vérifier que l'encodage de la page web, en-têtes de dire sont retournés et vérifiez qu'il est en fait, ce qu'il dit c'est.
L'unicode caractère de remplacement est généralement inséré comme un remplacement pour un illégales ou non reconnus personnage, qui pourrait être causé par plusieurs choses, mais la plus probable est que
le codage n'est pas ce qu'il prétend être.
OriginalL'auteur Steven D. Majewski
Merci beaucoup pour vos réponses, John et Steven. Vos réponses m'ont fait réfléchir différemment, ce qui m'a conduit à trouver la source du problème et d'une solution de travail.
Je travaillais avec le test code suivant:
À l'intérieur de la Scrapy coquille, quand j'ai extrait la description des données, il est sorti très bien. Il m'a donné une raison de soupçonner que quelque chose ne va pas dans mon code, parce que sur le
pdb
invite, j'ai été voir les caractères de remplacement dans les données extraites.Je suis passé par Scrapy docs pour la Réponse de la classe et ajusté le code ci-dessus:
La modification que j'ai faite a été de remplacer la ligne
html_response = HtmlResponse(URL).replace(body=response)
avechtml_response = HtmlResponse(URL, body=response)
. C'est ma compréhension que lareplace()
méthode a été en quelque sorte d'amputation des caractères spéciaux à partir de l'encodage d'un point de vue.Si quelqu'un souhaite à puce avec tous les détails de ce qu'est exactement le
replace()
méthode n'a de mal, je vous serais très reconnaissant de l'effort.Je vous remercie une fois de plus.
OriginalL'auteur ayaz
U+FFFD est le caractère de remplacement que vous obtenez lorsque vous effectuez
some_bytes.decode('some-encoding', 'replace')
et certains sous-chaîne desome_bytes
ne peut pas être décodé.Vous avez DEUX d'entre eux:
u'H\ufffd\ufffdftsitz'
... cela indique que le u tréma était représentée par DEUX octets chacun de qui a échoué à décoder. Le plus probable, le site est encodé en UTF-8, mais le logiciel est d'essayer de décoder ce que l'ASCII. D'essayer de décoder ASCII se produit généralement quand il est inattendu de la conversion en Unicode, et l'ASCII est utilisé comme le codage par défaut. Toutefois, dans ce cas, on ne s'attendrait pas la'replace'
arg à être utilisé. Plus probable que le code nécessaire dans un encodage et a été écrit par quelqu'un qui pense "ne pas soulever une exception" signifie la même chose que les "œuvres".De modifier une question à fournir l'URL, et de montrer la minimum code produit
u'H\ufffd\ufffdftsitz'
.OriginalL'auteur John Machin