Unicode:Python / lxml 文件输出不符合预期(打印 vs 写入)

2 投票
2 回答
505 浏览
提问于 2025-04-18 01:10

我正在用下面的代码解析一个xml文件:

import lxml

file_name = input('Enter the file name, including .xml extension: ')
print('Parsing ' + file_name)

from lxml import etree

parser = lxml.etree.XMLParser()


tree = lxml.etree.parse(file_name, parser)
root = tree.getroot()

nsmap = {'xmlns': 'urn:tva:metadata:2010'} 


with open(file_name+'.log', 'w', encoding='utf-8') as f:
    for info in root.xpath('//xmlns:ProgramInformation', namespaces=nsmap):
       crid = (info.get('programId'))
       titlex = (info.find('.//xmlns:Title', namespaces=nsmap))
       title = (titlex.text if titlex != None else 'Missing')
       synopsis1x = (info.find('.//xmlns:Synopsis[1]', namespaces=nsmap))             
       synopsis1 = (synopsis1x.text if synopsis1x != None else 'Missing')               
       synopsis1 = synopsis1.replace('\r','').replace('\n','')
       f.write('{}|{}|{}\n'.format(crid, title, synopsis1))    

举个例子,标题是'Přešité bydlení'。当我在解析文件时打印这个标题,它显示得很正常。但是当我把它写出来的时候,却变成了'PÅ™eÅ¡ité bydlení'。

我知道这跟编码有关(因为我能把打印命令改成用UTF-8,然后输出就变得“乱码”了),但我就是没办法让写出来的内容显示得像我想要的那样。我看了一下codecs库,但没成功。在XML解析器那一行加上'encoding = "utf-8"'也没有什么效果。

我该怎么设置才能让写出来的内容人能看懂呢?

2 个回答

0

你的代码看起来没问题,所以我猜你的输入有问题。如果你用支持UTF-8的工具或者命令行查看输出文件,我怀疑在<?xml中的编码和实际编码不一致。

这就能解释为什么打印可以正常工作,但写入文件却不行。如果你的命令行或开发环境设置为“ISO-8859-2”,而你的输入XML也是“ISO-8859-2”,那么打印出来的就是原始编码。

2

我之前在这方面遇到了各种麻烦,但解决办法其实很简单。在文档中有一章专门讲如何在文件中读写unicode。还有这个Python讲座,对理解这个问题也很有帮助。处理unicode确实让人头疼,不过如果你开始使用Python 3,就会简单很多。

import codecs
f = codecs.open('test', encoding='utf-8', mode='w+')
f.write(u'\u4500 blah blah blah\n')
f.seek(0)
print repr(f.readline()[:1])
f.close()

撰写回答