2010-11-19 7 views
0

i ont rencontré des problèmes de codage lors de l'utilisation libxml2 en python pour analyser charactors chinoisparsing XML Python libxml2 ayant des caractères chinois

# coding=utf8 
import libxml2 

def output(data): 
    doc = libxml2.parseMemory(data, len(data)) 
    ctxt = doc.xpathNewContext() 
    res_rslt = ctxt.xpathEval("/r/e/attribute::Name") 
    print res_rslt[0] 

data = '''<r><e RoleID="3247" Name="中文"></e></r>''' 

output(data) 

l'out mis est

Name="&#x4E2D;&#x6587;" 

alors que je me attends

Name="中文" 

comment pourrais-je le faire?

Répondre

0

Ma réponse à ce genre de choses semble toujours être "utiliser Beautiful Soup". Et je reçois toujours des votes pour ça aussi (ce qui montre, je pense, que d'autres sont d'accord avec moi que c'est bon). Le fait est que libxml2 convertit ces caractères en les entités XML correctes qui sont correctes pour XML. Beautiful Soup n'a pas de telles notions de ressentir un besoin d'être correct - donc cela vous donne juste ce que vous voulez.

(Notez dans ce cas que l'utilisation soit u'...' ou '...' fonctionnera;. Je l'ai mis en unicode parce qu'il se sent mieux de cette façon - quoi que vous fassiez, Beautiful Soup gives you Unicode)

1

Avec lxml, les choses sont plus faciles et ils travaillent. C'est une liaison Pythonic pour la bibliothèque libxml2 et fonctionne à merveille.

>>> from lxml import etree 
>>> x = etree.fromstring('''<r><e RoleID="3247" Name="中文"></e></r>''') 
>>> name = x[0].get('Name') 
>>> print name 
中文 

Et oui, XPath est également pris en charge. La documentation est here.

En ce qui concerne votre programme, consultez ceci:

# -*- coding: utf-8 -*- 

import libxml2 

def output(data): 
    doc = libxml2.parseDoc(data) 
    ctxt = doc.xpathNewContext() 
    res_rslt = ctxt.xpathEval("/r/e/attribute::Name") 
    return res_rslt[0] 

data = u'''<?xml version="1.0" encoding="UTF-8"?><r><e RoleID="3247" Name="中文"></e></r>'''.encode("UTF-8") 

print output(data) 
+0

'de etree' d'importation lxml –

+0

Oh oui, fixe. – user225312