2015-12-04 30 views
5

My Kod:lxml nie można analizować XML (kodowanie pogoda jest UTF-8 lub nie) [pyton]

import re 
import requests 
from lxml import etree 

url = 'http://weixin.sogou.com/gzhjs?openid=oIWsFt__d2wSBKMfQtkFfeVq_u8I&ext=2JjmXOu9jMsFW8Sh4E_XmC0DOkcPpGX18Zm8qPG7F0L5ffrupfFtkDqSOm47Bv9U' 

r = requests.get(url) 

items = r.json()['items'] 
  1. bez kodowania (UTF-8 ')

etree.fromstring(items[0]) Wydajność:

ValueError         
Traceback (most recent call last) 
<ipython-input-69-cb8697498318> in <module>() 
----> 1 etree.fromstring(items[0]) 

lxml.etree.pyx in lxml.etree.fromstring (src\lxml\lxml.etree.c:68121)() 

parser.pxi in lxml.etree._parseMemoryDocument (src\lxml\lxml.etree.c:102435)() 

ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration. 
  1. z kodowania (UTF-8 ')

etree.fromstring(items[0].encode('utf-8')) wyjściowa:

File "<string>", line unknown 
XMLSyntaxError: CData section not finished 
鎶楀啺鎶㈤櫓鎹锋姤:闃冲寳I绾挎, line 1, column 281 

nie pomysł, aby przeanalizować ten xml ..

+1

spojrzeć na następujące odpowiedzi: http://stackoverflow.com/questions/15830421/xml-unicode-strings-with-encoding-declaration-are-not -supported – Lea

Odpowiedz

4

Jako obejście, można usunąć atrybut encoding przed przekazać ciąg etree.fromstring:

xml = re.sub(r'\bencoding="[-\w]+"', '', items[0], count=1) 
root = etree.fromstring(xml) 

UPDATE po obejrzeniu komentarza @ Lea w pytaniu:

Określ parser z wyraźną kodowania:

xml = r.json()['items'].encode('utf-8') 
root = etree.fromstring(xml, parser=etree.XMLParser(encoding='utf-8')) 
+0

Czy mógłbyś podać mi wyjaśnienie, dlaczego etree kończy się niepowodzeniem? Jeśli otrzymam komunikat "XMLSyntaxError", to czy "kodowanie" będzie zawsze działało? – Mithril

+0

@Mithril, domyślam się **, że niedopasowanie między 'gbk' i' utf-8' powoduje, że parser interpretuje tag jako nie-tag. – falsetru

+0

Wydaje się, że nie ma wszechpotężnego sposobu rozwiązania wszystkich takich błędów. Dziękuję Ci bardzo. – Mithril