web-dev-qa-db-fra.com

Comment gérer l'encodage de réponse depuis urllib.request.urlopen ()

J'essaie de rechercher une page Web à l'aide d'expressions régulières, mais l'erreur suivante s'affiche:

TypeError: impossible d'utiliser un modèle de chaîne sur un objet de type octet

Je comprends pourquoi, urllib.request.urlopen () renvoie un flux de données et donc, au moins, je suppose, re ne connaît pas l’encodage à utiliser. Qu'est-ce que je suis censé faire dans cette situation? Y at-il un moyen de spécifier la méthode de codage dans un urlrequest peut-être ou devrai-je recoder la chaîne moi-même? Si oui, qu'est-ce que je cherche à faire, je suppose que je devrais lire le codage à partir des informations d'en-tête ou du type de codage, si spécifié dans le code HTML, puis le recoder à nouveau pour cela?

37
kryptobs2000

Il vous suffit de décoder la réponse, en utilisant l'en-tête Content-Type, généralement la dernière valeur. Il y a un exemple donné dans le tutoriel aussi.

output = response.decode('utf-8')
38
Senthil Kumaran

Quant à moi, la solution est la suivante (python3):

resource = urllib.request.urlopen(an_url)
content =  resource.read().decode(resource.headers.get_content_charset())
73
Ivan Klass

J'ai eu les mêmes problèmes au cours des deux derniers jours. J'ai enfin une solution. J'utilise la méthode info() de l'objet renvoyé par urlopen():

req=urllib.request.urlopen(URL)
charset=req.info().get_content_charset()
content=req.read().decode(charset)
6
pytohs

Avec demandes :

import requests

response = requests.get(URL).text
6
xged
urllib.urlopen(url).headers.getheader('Content-Type')

Produira quelque chose comme ceci:

text/html; charset=utf-8

0
wynemo