2013-07-02 10 views
20

Version: Python 2.7.3Python Requests Codierung POST-Daten

Andere Bibliotheken: Python-Requests 1.2.3, jinja2 (2,6)

Ich habe ein Skript, das Daten zu einem Forum einreicht und das Problem ist, diese nicht-ASCII-Zeichen erscheinen als Müll. Zum Beispiel erscheint ein Name wie André Téchiné als André Tékiné.

Hier ist, wie die Daten vorgelegt werden:

1) Daten zunächst von einer UTF-8 kodierten CSV-Datei wie so geladen sind:

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 von der Unterseite des Python CSV Dokumentation Seite lautet: http://docs.python.org/2/library/csv.html

Wenn ich den Namen der Einträge im Interpreter eingeben, sehe ich den Namen als u'Andr\xe9 T\xe9chin\xe9'.

2) Als nächstes mache ich die Daten durch jinja2:

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

Als ich den Namen in dem Interpreter gemacht geben sehe ich wieder das gleiches: u'Andr\xe9 T\xe9chin\xe9'

Nun, wenn ich die gerenderte Variable schreiben ein Dateiname wie folgt, zeigt es richtig:

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

Aber ich es an das Forum senden müssen:

3) Auf dem Anforderungscode POST ich habe:

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

Sitzung ist eine Sitzung ersucht.

Und der Name wird im Forenbeitrag gebrochen angezeigt. Ich habe folgendes versucht:

  • Lassen Sie heraus Header
  • Encode als rendered.encode gemacht ('utf-8') (gleiches Ergebnis)
  • gemacht = urllib.quote_plus (gerendert) (kommt als all% XY)

Wenn ich rendered.encode Typ ('utf-8') ich sehe die folgenden:

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

Wie konnte ich beheben das Problem? Vielen Dank.

Antwort

24

Ihr Kunde verhält, wie es sollte z.B.Lauf nc -l 8888 als Server und macht eine Anfrage:

import requests 

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

zeigt:

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 

können Sie überprüfen, ob es richtig ist:

>>> import urllib 
>>> urllib.unquote_plus(b"Andr%C3%A9+T%C3%A9chin%C3%A9").decode('utf-8') 
u'Andr\xe9 T\xe9chin\xe9' 
    die Anfrage
  • Prüfung der Server decodiert korrekt. Sie könnten versuchen, den Zeichensatz angeben:

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

    der Körper enthält nur ASCII-Zeichen, so sollte es nicht schaden, und die richtigen Server alle Parameter für x-www-form-urlencoded Typ sowieso ignorieren würde. Suchen Sie nach blutigen Details in URL-encoded form data

  • Prüfung das Problem ist nicht eine Anzeige Artefakt dh der Wert korrekt ist, aber es zeigt falsch

+0

„check das Problem nicht ein Display Artefakt dh, ist der Wert korrekt aber es wird falsch angezeigt "- Danke. Das ist das Problem! Leider ist es ein öffentliches Forum und ich kann die Standardcodierung nicht ändern. Es reagiert mit der iso-8859-1-Codierung. Kann ich gerenderten Code ('iso-8859-1') verwenden oder wird das die Dinge kaputt machen? Vielen Dank. – TheMagician

+1

versuchen, Zeichensatz in den Headern – jfs

+0

Das hat nicht funktioniert. – TheMagician

1

Versuchen in UTF-8 zu entschlüsseln:

unicode(my_string_variable, "utf8") 

oder dekodieren und kodieren:

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