在Python中获取字符串和CSV文件的正确编码

7
我正在使用Python中的Mechanize从网站上获取一些数据并发送它们的新数据。
问题是该网站是法语的,因此我得到的是钻石形状的问号(�),而不是各种字符,例如éÉÀàùÙîû等。
我尝试在Google和StackOverflow上查找并找到了各种回答,但没有解决我的问题。我看到有人建议尝试以下行之一:
myString = éÀî

myString.encode('latin-1')
myString.encode('iso-8859-1')

unicode(myString, 'iso-8859-1')

但是这些方法似乎都不起作用。

我需要解决的两种情况是读取带有重音符号的csv文件以及包含重音符号的硬编码字符串。例如,这是csv文件中一行的样子(实际上';'是分隔符):

Adam Guérin;myemail@mail.com;555-5555;2011-02-05

“é”看起来没问题,但是当我尝试用机械化工具填写textField并提交时,在实际网站上,“é”现在看起来像“�”。

编辑:

这是我的代码,用于读取csv文件中的数据:

subscriberReader = csv.reader(open(path, 'rb'), delimiter=';')
subscribers = []

for row in subscriberReader:
    subscribers.append(Subscriber(row[0], row[1], row[2]))

然后我使用机械化工具将其发送到网站:
self.br.select_form('aspnetForm')

self.br.form['fldEmail'] = subscriber.email
self.br.form['fldName'] = subscriber.name
self.br.form['fldPhoneNum'] = subscriber.phoneNum

self.br.submit()

我尝试了多种方法来编码这些字符,但我觉得我的做法不正确。我很乐意尝试答案/评论中提出的任何建议。
至于这个网站,它在头部没有指定使用哪种编码方式。

你使用的是哪个版本的Python? - Lanaru
请尝试使用 Unicode 字符串,例如 str_ = u"éÀî"。 - Michal
@Wyseck 我刚试了一下,不起作用。我已经尝试过unicode(myString, 'iso-8859-1')和其他编码类型,但我忘记在问题中提到它了。 - Jumbala
2
这可能听起来有些傻,但它似乎不是一个Python的问题。看起来你在网站编码方面存在问题。你确定网站的编码是正确的吗?你能在你的网站上看到这些法语字符吗? - Michal
你能在浏览器中看到正确的文本吗?它报告的字符编码是什么?服务器是否发送了正确的字符编码? - jfs
显示剩余10条评论
1个回答

4

首先,你提到想要在代码中插入文字。为此,你需要告诉Python你的脚本文件使用的编码方式。你可以在文件开头使用注释声明来实现这一点(我假设你使用的是latin-1编码)。

# -*- coding: latin-1 -*-
myString = u'éÀî'

其次,您需要能够处理字符串。这不是特定于机械化的,但覆盖一些基础知识可能会很有用:首先,myString 最终成为一个Unicode对象(因为声明文字方式使用了u'')。因此,若要将其用作Latin-1编码,则需要调用.encode(),例如:

with open('test.txt', 'w') as f:
    f.write(myString.encode('latin-1'))

最后,当读取编码的字符串(比如从远程网站)时,您可以使用.decode()将其解码为Unicode对象,并从那里处理它。

with open('test.txt', 'r') as f:
    myString = f.read().decode('latin-1')

为了表明源代码和文件字符编码之间没有关系,您可以为每个使用不同的编码。您的回答没有涵盖如何获取通过http发送的HTML文件的字符编码。参考:http://en.wikipedia.org/wiki/Character_encodings_in_HTML - jfs
你可以使用'wb'模式将字节写入文件,使用'rb'读取字节。 - jfs
@J.F.Sebastian:没错,那是个打错字,抱歉。 - voithos
@AdamSmith:Web服务器应该包含一个指定编码的头部或元标签。如果没有,我认为它是有问题的。 - Wooble
实际上,从源代码的快速浏览来看,似乎 mechanize 本身会读取头文件并为您解码内容。 - Wooble
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接