我在python中使用libxml2解析中文字符时遇到了编码问题
# 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="中文"
虽然我期待
Name="中文"
我怎么能做到?
答案 0 :(得分:1)
使用lxml
,事情变得更容易并且有效。它是libxml2
库的Pythonic绑定,效果非常好。
>>> 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)
答案 1 :(得分: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是正确的。美丽的汤没有任何感觉需要正确的概念 - 所以它只是给你你想要的东西。
(请注意,在这种情况下,使用u'...'
或'...'
都可行;我只是将其设为unicode
因为感觉更好 - 无论你做什么,{{3 }}。)