2010-11-19 2 views
0

я столкнулся с проблемами кодирования при использовании libxml2 в Python для разбора китайского charactorsPython libxml2 разбора XML, имеющие китайские иероглифы

# 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) 

из положить является

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

в то время как я жду

Name="中文" 

Как я могу это сделать?

ответ

0

Мой ответ на подобные вещи всегда кажется «использовать Beautiful Soup». И я всегда поддерживаю это тоже (что, я думаю, показывает, что другие согласны со мной в том, что это хорошо).

>>> from BeautifulSoup import BeautifulSoup 
>>> soup = BeautifulSoup(u'''<r><e RoleID="3247" Name="中文"></e></r>''') 
>>> print soup.r.e['name'] 
中文 

Дело в том, что libxml2 преобразовывает эти символы в соответствующие XML-сущностей, которые для XML является правильным. У Beautiful Soup нет таких представлений о том, что нужно быть верным, и это просто дает вам то, что вы хотите.

(Заметьте, что в этом случае, используя либо u'...' или '...' будет работать;. Я просто положить его в качестве unicode, потому что он чувствует себя лучше, что путь - все, что вы делаете, Beautiful Soup gives you Unicode)

1

С lxml, все проще и они работают. Это Pythonic привязка для библиотеки libxml2 и работает чудесно.

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

И да, XPath также поддерживается. Документация: here.

В вашей программе, посмотрите на это:

# -*- 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

'от LXML импорта etree' –

+0

Ах да, неподвижным. – user225312

Смежные вопросы