Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / httplib et unicode : UnicodeEncodeError

httplib et unicode : UnicodeEncodeError

Remonter à Forum général Python
  • httplib et unicode : UnicodeEncodeError

    Envoyé par FrViPofm le 16 Mai 2011 à 13:00
    Bonjour,

    J'essaie d'importer des pages via httplib et j'ai des problèmes d'unicode... (python 2.7.1)

    dans le module HTTPRequest.py (que je n'ai pas écrit mais que je peux modifier)
    === modules/HTTPRequest.py ===

    import httplib ...
    class httpRequest:

    def __init__(self,
    [...]
    self._conn = httplib.HTTPConnection(server, port)

    def _http_request(self, cmd, path, auth, send):
    [...]
    self._conn.putrequest(cmd, path)
    self._conn.putheader('User-Agent', self._created_by)
    if send:
    self._conn.send(send)
    response = self._conn.getresponse()
    if response.status 200:
    response.read()
    [...]
    return response.read()

    ==========

    dans le script scrap.py
    === scrap.py ===

    import modules.HTTPRequest as HTTPRequest
    books = [ u"Livre 1", u"Livre 2"]
    class Page :
    def __init__(self,server= u"example.com", port=80,verbose=True):
    self.request = HTTPRequest.httpRequest(server, port)

    def getPage (self, url):
    self.page = self.request.get(url)
    return self.page

    def extractAll(self, row, reg, options = re.M):
    it = re.compile(reg, options).findall(row)
    if (it):
    return it
    else:
    return None
    [...]


    page = Page()

    def main(argv):
    for book in books:
    page.getPage(book_url_format.format(book))
    rows = page.split(splitter)
    for row in rows:
    indexes = page.extractAll(row, extr)
    if indexes:
    for index in indexes:
    csv.writeln(u"%s,%s" % index)

    =============
    Et j'obtiens immanquablement :
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 12: ordinal not in range(128)


    La page html reçue est encodée en utf-8 et contient des caractères accentués. Mais il semble que httplib retourne de l'ASCII ou du bitstream ou je-ne-sais-quoi, bref quelque chose qui n'est pas compatible avec mon csv.writeln(u"%s,%s" % index).
    Pourtant j'y tiens parce que je voudrais ajouter des infos sur la ligne qui sont en utf-8.

    À voir la littérature de python, c'est le plus en amont possible que je devrais encoder en utf-8, donc dans httpRequest._http_request()
    Mais je ne parviens pas à transformer le response.read() en unicode.
    J'ai bien essayé des return(unicode(response.read())) ou autres qui me retournent la même erreur,, mais plus en amont.

    Le top serait de réemployer le charset fourni par le serveur :
    charset = response.getheader('Content-Type').split(';')[1].split('=')[1]

    Si vous avez des idées...
    Merci d'avance.
    --
    Vincent
Rendu par Ploneboard