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

'é' 看起来不错,但是当我尝试用 mechanize 填充网站上的 textField 并提交时,'é' 现在在实际网站上看起来像 '''。

编辑:

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

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

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

然后我使用 mechanize 将其发送到网站:

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()

我尝试了各种方法来对字符进行编码,但我想我做得不对。我很乐意尝试答案/评论中建议的任何内容。

至于网站,它没有指定它在标题中使用的编码。

4

1 回答 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')
于 2012-08-02T20:42:58.097 回答