7

Python で mechanize を使用して、Web サイトからデータを取得し、新しいデータを送信しています。

問題は、サイトがフランス語であるため、éÉÀàùÙîû などのさまざまな文字の代わりに、ひし形 (�) の疑問符が表示されることです。

Google と StackOverflow を調べてみたところ、問題を解決できないさまざまな回答が見つかりました。次の行のいずれかを試すことを推奨する回答を見てきました。

myString = éÀî

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

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

しかし、どれも機能していないようです。

これが必要になる 2 つのケースは、アクセント付きの csv ファイルと、アクセント付きのハードコードされた文字列を読み取るときです。たとえば、csv ファイルの行は次のようになります (実際には「;」が区切り文字です)。

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

「é」は問題ないように見えますが、Web サイトの textField に mechanize を入力して送信しようとすると、実際の Web サイトでは「é」が「�」のように見えます。

編集:

これは、csv ファイル内のデータを読み取るための私のコードです。

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

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

次に、mechanize を使用して Web サイトに送信します。

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

最後に、エンコードされた文字列を (たとえば、リモート Web サイトから) 読み取る場合、 を使用.decode()してそれを Unicode オブジェクトにデコードし、そこから操作できます。

with open('test.txt', 'r') as f:
    myString = f.read().decode('latin-1')
于 2012-08-02T20:42:58.097 に答える