Python请求编码POST d

2024-09-21 04:28:16 发布

您现在位置:Python中文网/ 问答频道 /正文

版本:Python2.7.3

其他库:Python请求1.2.3、jinja2(2.6)

我有一个向论坛提交数据的脚本,问题是非ascii字符显示为垃圾。例如,像AndréTéchineé这样的名字就是AndrÃTÃchinÃ)。

以下是提交数据的方式:

1)数据最初从UTF-8编码的CSV文件加载,如下所示:

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阅读器位于Python csv文档页的底部: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)在邮政请求代码中,我有:

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

会话是请求会话。

而且这个名字在论坛帖子中显示的很烂。我试过以下方法:

  • 漏掉标题
  • Encode呈现为rendered.Encode('utf-8')(相同结果)
  • rendered=urllib.quote_plus(rendered)(显示为所有%XY)

如果我输入rendered.encode('utf-8'),我会看到以下内容:

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

我怎样才能解决这个问题?谢谢。


Tags: csv数据jinja2with名字论坛utfheaders
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')

您的客户机的行为应该是这样的,例如,作为服务器运行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类型的任何参数。在URL-encoded form data中查找血淋淋的细节

  • 检查问题是否为显示伪影,即值是否正确,但显示不正确

相关问题 更多 >

    热门问题