Подтвердить что ты не робот

Python запрашивает кодирование данных POST

Версия: Python 2.7.3

Другие библиотеки: Python-Requests 1.2.3, jinja2 (2.6)

У меня есть script, который отправляет данные на форум, и проблема в том, что символы не-ascii отображаются как мусор. Например, такое имя, как André Téchiné, выдается как Andrà © Tin chin.

Здесь представлены данные:

1) Данные изначально загружаются из CSV файла с кодировкой UTF-8, например:

entries = []
with codecs.open(filename, 'r', 'utf-8') as f:
    for row in unicode_csv_reader(f.readlines()[1:]):
        entries.append(dict(zip(csv_header, row)))

unicode_csv_reader находится внизу страницы документации по CSV Python: http://docs.python.org/2/library/csv.html

Когда я ввожу имя записи в интерпретаторе, я вижу это имя как u'Andr\xe9 T\xe9chin\xe9'.

2) Далее я передаю данные через jinja2:

tpl = tpl_env.get_template(u'forumpost.html')
rendered = tpl.render(entries=entries)

Когда я набираю имя, отображаемое в интерпретаторе, я вижу снова одно и то же: u'Andr\xe9 T\xe9chin\xe9'

Теперь, если я напишу визуализированную переменную в имя файла, как это, он отобразится правильно:

with codecs.open('out.txt', 'a', 'utf-8') as f:
    f.write(rendered)

Но я должен отправить его на форум:

3) В коде запроса POST у меня есть:

params = {u'post': rendered}
headers = {u'content-type': u'application/x-www-form-urlencoded'}
session.post(posturl, data=params, headers=headers, cookies=session.cookies)
Сеанс

- это сеанс запросов.

И имя отображается в сообщении форума. Я пробовал следующее:

  • Оставьте заголовки
  • Кодировать rendered как rendered.encode('utf-8') (тот же результат)
  • rendered = urllib.quote_plus (отображается) (выводится как все% XY)

Если я нахожу rendered.encode('utf-8'), я вижу следующее:

'Andr\xc3\xa9 T\xc3\xa9chin\xc3\xa9'

Как я могу исправить проблему? Спасибо.

4b9b3361

Ответ 1

Ваш клиент ведет себя так, как должен, например. запустив nc -l 8888 в качестве сервера и сделав запрос:

import requests

requests.post('http://localhost:8888', data={u'post': u'Andr\xe9 T\xe9chin\xe9'})

показывает:

POST / HTTP/1.1
Host: localhost:8888
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate, compress
Accept: */*
User-Agent: python-requests/1.2.3 CPython/2.7.3

post=Andr%C3%A9+T%C3%A9chin%C3%A9

Вы можете проверить, что это правильно:

>>> import urllib
>>> urllib.unquote_plus(b"Andr%C3%A9+T%C3%A9chin%C3%A9").decode('utf-8')
u'Andr\xe9 T\xe9chin\xe9'
  • проверьте, что сервер правильно декодирует запрос. Вы можете попробовать указать кодировку:

    headers = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}
    

    тело содержит только символы ascii, поэтому это не должно повредить, и правильный сервер будет игнорировать любые параметры для типа x-www-form-urlencoded. Найдите подробности gory в данные формы в виде URL-адреса

  • проверить, что проблема не является артефактом отображения, т.е. значение правильное, но оно отображается неправильно

Ответ 2

Попробуйте декодировать в utf8:

unicode(my_string_variable, "utf8")

или декодировать и кодировать:

sometext = gettextfromsomewhere().decode('utf-8')
env = jinja2.Environment(loader=jinja2.PackageLoader('jinjaapplication', 'templates'))
template = env.get_template('mypage.html')
print template.render( sometext = sometext ).encode('utf-8')