0

J'ai un code python qui lit une donnée de page depuis Confluence en utilisant l'API REST, puis en utilisant ces données crée une nouvelle page dans Confluence . Lors de la publication des données, le code renvoie l'erreur ci-dessous:Python post demande throws UnicodeEncodeError: le codec 'ascii' ne peut pas encoder le caractère '

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 48108: ordinal not in range(128) 

Cependant, cela fonctionne assez bien dans Postman. Ma conjecture est que le facteur gère l'encodage. J'ai trouvé beaucoup de réponses qui suggéraient d'utiliser str.encode('utf-8') et str.encode('ascii', 'ignore') mais aucune n'a fonctionné pour moi. J'ai également essayé:

import sys 
    reload(sys) 
    sys.setdefaultencoding('utf-8')  

mais en vain. Si j'utilise l'un de ces pour coder, alors je reçois 500 erreur interne tout en tirant la demande de poste.

Voici mon code python: get_template_data obtient les détails de la page de confluence et l'utilise dans la demande de publication pour créer une nouvelle page. La ligne de coup critique est r = requests.post(url, headers=headers, data=post_body_str). Donc, il est probable que les données dans le post_body_str ont quelque chose à voir avec cela.

Le dessous est le stracktrace:

Traceback (most recent call last): 
    File "new_status.py", line 216, in <module> 
    main() 
    File "new_status.py", line 193, in main 
    create_weekly_status_page(weekly_status_str,template_data) 
    File "new_status.py", line 79, in create_weekly_status_page 
    url = 'https://confluence.abc.com/rest/api/content/' 
    File "/Library/Python/2.7/site-packages/requests/api.py", line 110, in post 
    return request('post', url, data=data, json=json, **kwargs) 
    File "/Library/Python/2.7/site-packages/requests/api.py", line 56, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/Library/Python/2.7/site-packages/requests/sessions.py", line 488, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/Library/Python/2.7/site-packages/requests/sessions.py", line 609, in send 
    r = adapter.send(request, **kwargs) 
    File "/Library/Python/2.7/site-packages/requests/adapters.py", line 423, in send 
    timeout=timeout 
    File "/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 594, in urlopen 
    chunked=chunked) 
    File "/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 361, in _make_request 
    conn.request(method, url, **httplib_request_kw) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 1053, in request 
    self._send_request(method, url, body, headers) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 1093, in _send_request 
    self.endheaders(body) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 1049, in endheaders 
    self._send_output(message_body) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 897, in _send_output 
    self.send(message_body) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 869, in send 
    self.sock.sendall(data) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 721, in sendall 
    v = self.send(data[count:]) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 687, in send 
    v = self._sslobj.write(data) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 52926: ordinal not in range(128) 

Aussi, j'utilise body.export_view tout en obtenant des données de modèle, car cette page contient des macros et je ne veux pas des macros pour copiés, mais plutôt les résultats des macros pour être copié. Par conséquent, en utilisant body.export_view.

Je suis tout à fait nouveau à Python. Et écrire cela pour automatiser quelques trucs et apprendre Python à côté. J'apprécierai de l'aide/des pointeurs.

Python Version: 2.7.10

Répondre

1

J'ai finalement réussi à obtenir ce travail avec l'aide de ces deux lignes:

template_data = template_data.encode('ascii', 'ignore') et
template_data = template_data.replace('\n', '\\n')

La première ligne fixe le UnicodeEncodeError alors que le la deuxième ligne fixe le 500 Internal Error.