当前位置:  开发笔记 > 编程语言 > 正文

使用Python Requests库将unicode字符串发布到Web服务

如何解决《使用PythonRequests库将unicode字符串发布到Web服务》经验,为你挑选了1个好方法。

我正在尝试使用请求库将包含花哨的unicode符号的文本片段发布到Web服务.我正在使用Python 3.5.

text = "Två dagar kvar"
r = requests.post("http://json-tagger.herokuapp.com/tag", data=text)
print(r.json()

我得到一个UnicodeEncodeError,但我无法弄清楚我在做什么我做错了,请求的文档只讨论我看到的GET请求中的unicode.

    UnicodeEncodeError                        Traceback (most recent call last)
 in ()
     19         print("cleaned : " + line)
     20 
---> 21         r = requests.post("http://json-tagger.herokuapp.com/tag", data=line)
     22         sentences = r.json()['sentences']
     23         for sentence in sentences:

//anaconda/lib/python3.4/site-packages/requests/api.py in post(url, data, json, **kwargs)
    105     """
    106 
--> 107     return request('post', url, data=data, json=json, **kwargs)
    108 
    109 

//anaconda/lib/python3.4/site-packages/requests/api.py in request(method, url, **kwargs)
     51     # cases, and look like a memory leak in others.
     52     with sessions.Session() as session:
---> 53         return session.request(method=method, url=url, **kwargs)
     54 
     55 

//anaconda/lib/python3.4/site-packages/requests/sessions.py in request(self, method, url, params, data, headers, cookies, files, auth,     timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    466         }
    467         send_kwargs.update(settings)
--> 468         resp = self.send(prep, **send_kwargs)
    469 
    470         return resp

//anaconda/lib/python3.4/site-packages/requests/sessions.py in send(self, request, **kwargs)
    574 
    575         # Send the request
--> 576         r = adapter.send(request, **kwargs)
    577 
    578         # Total elapsed time of the request (approximately)

//anaconda/lib/python3.4/site-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    374                     decode_content=False,
    375                     retries=self.max_retries,
--> 376                     timeout=timeout
    377                 )
    378 

//anaconda/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py in urlopen(self, method, url, body, headers, retries,     redirect, assert_same_host, timeout, pool_timeout, release_conn, **response_kw)
    557             httplib_response = self._make_request(conn, method, url,
    558                                                   timeout=timeout_obj,
--> 559                                                   body=body, headers=headers)
    560 
    561             # If we're going to release the connection in ``finally:``, then

//anaconda/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py in _make_request(self, conn, method, url, timeout,     **httplib_request_kw)
    351         # conn.request() calls httplib.*.request, not the method in
    352         # urllib3.request. It also calls makefile (recv) on the socket.
--> 353         conn.request(method, url, **httplib_request_kw)
    354 
    355         # Reset the timeout for the recv() on the socket

//anaconda/lib/python3.4/http/client.py in request(self, method, url, body, headers)
   1086     def request(self, method, url, body=None, headers={}):
   1087         """Send a complete request to the server."""
-> 1088         self._send_request(method, url, body, headers)
   1089 
   1090     def _set_content_length(self, body):

//anaconda/lib/python3.4/http/client.py in _send_request(self, method, url, body, headers)
   1123             # RFC 2616 Section 3.7.1 says that text default has a
   1124             # default charset of iso-8859-1.
-> 1125             body = body.encode('iso-8859-1')
   1126         self.endheaders(body)
   1127 

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 14-15: ordinal not in range(256)

解决方法:我从"表情符号"块,U + 1F600 - U + 1F64F以及符号和象形文字"块,U + 1F300 - U + 1F5FF中删除文本中的所有unicode字符,根据此答案使用以下代码,因为我不喜欢不需要表情符号和图片进行分析:

text = re.sub(r'[^\u1F600-\u1F64F ]|[^\u1F300-\u1F5FF ]',"",text)

更新 Web服务的创建者现已修复此问题并更新了文档.您所要做的就是在Python 3中发送一个编码字符串:

""Två dagar kvar".encode("utf-8")

jfs.. 10

目前尚不清楚json-tagger.herokuapp.com所期望的内容类型(示例是矛盾的).您可以尝试将数据发布为文本:

#!/usr/bin/env python
import requests  # pip install requests

r = requests.post(url,
                  data=text.encode('utf-8'),
                  headers={'Content-type': 'text/plain; charset=utf-8'})
print(r.json())

或者您可以尝试将其发送为application/x-www-form-urlencoded:

#!/usr/bin/env python
import requests  # pip install requests

r = requests.post(url, data=dict(data=text))
print(r.json())

服务器可以拒绝接受,接受两者,接受一个而不接受另一个,或者期望一些其他格式(例如,application/json)等.



1> jfs..:

目前尚不清楚json-tagger.herokuapp.com所期望的内容类型(示例是矛盾的).您可以尝试将数据发布为文本:

#!/usr/bin/env python
import requests  # pip install requests

r = requests.post(url,
                  data=text.encode('utf-8'),
                  headers={'Content-type': 'text/plain; charset=utf-8'})
print(r.json())

或者您可以尝试将其发送为application/x-www-form-urlencoded:

#!/usr/bin/env python
import requests  # pip install requests

r = requests.post(url, data=dict(data=text))
print(r.json())

服务器可以拒绝接受,接受两者,接受一个而不接受另一个,或者期望一些其他格式(例如,application/json)等.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有