Python libxml2解析带有中文字符的xml

时间:2010-11-19 12:39:30

标签: python encoding utf-8 libxml2

我在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="&#x4E2D;&#x6587;"

虽然我期待

Name="中文"

我怎么能做到?

2 个答案:

答案 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 }}。)