使用lxml.etree处理含有中文档、字符串时,可能会中文字符不能正常显示的情况(通常显示为Unicode码,如:这是
),这里分别针对字符串和文档的处理给出了几种解决方安。
处理字符串
1、使用html.unescape()
将字符引用(字符实体名称或编号:&entity_name;
,&entity_number;
,如,>
, >
,>
)转换为相应的字符实体;
2、指定编码解码方式方式
from lxml import etree
import html
text = """this is test content;这是测试内容。"""
html1 = etree.HTML(text)
# html1 = etree.fromstring(text) # 同HTML()
# 方法1 使用html.unescape()
res = etree.tostring(html1)
print(html.unescape(res.decode('utf-8')))
# 方法2 使用uft-8编码
res = etree.tostring(html1,encoding="utf-8") # 这种方法对标签用的中文属性无效
print(res.decode('utf-8'))
处理文本文档
1、使用open方法打开并读取文档,此可采用处理字符串相同的方法; 2、使用etree.parse()读取文档时指定编码方式。
# 方法1 使用open读取文档做字符串处理
with open('test.html') as f:
html1 = etree.HTML(f.read())
# 之后代码同 处理字符串 的两种方法
# 方法2 parse读取文档时指定编码方式
html1 = etree.parse('test.html',etree.HTMLParser(encoding='utf-8'))
# 这里要指定正确(与所读取文档相应的编码)的编码方式,不然后面会出现乱码
# 之后代码同 处理字符串 的两种方法
通常中文字符不能正常显示有两种情况,一种表现是显示为字符编码(如,\xe8\xbf
、这是
),另一种是乱码(如,è¿ææµè¯å
),前者的问题在于没有解码,而后者则是字符串编码与解码方式不匹配,上面的方法基本可以解决xml解析中遇到的中文编码、乱码问题。如果中文字符出现在标签属性上时,需使用第一种方法才可以正常显示。