我需要使用python的requests 下载一些文件,但是文件是中文名的
chrome调试看出来的文件名是
Content-Disposition:attachment; filename=%C9%F1%BC%B6%BB%F5%C0%C9.txt
requests 下载显示的却是乱码
import requests
url = 'http://www.23us.so/modules/article/txtarticle.php?id=156'
req = requests.head(url)
headers = req.headers
print( headers.get('Content-Disposition'))
>> attachment; filename=ÇàÔÆÏÉ·.txt
我试过设置req.encoding 没有效果
怎么把header中的文字恢复出来,requests中似乎没有相关方法
各位可以调试一下
Ahem, vous auriez dû publier l'adresse spécifique du lien plus tôt, je vais suivre la méthode et mettre le code :
Résultat :
Vous pouvez simplement laisser
Résultat :req.encoding
deviner la méthode d'encodage de la cible. Le commentaire sur la ligne 769 dedu module
requests
models.py
indique très clairement que les gens peuvent détecter automatiquement le type d'encodage du. contenu de la page Web cible, et le code spécifique responsable de la détection de l'encodage est iciuniversaldetector.py
, il suffit donc d'utiliser cette fonctionnalité pour encoder puis d'appuyer sur
utf-8
pour décoder. >Affichez tous les en-têtes et voyez. Il devrait y avoir un attribut charset.
Mise à jour
Il s'agit en fait d'un encodage URI, qui est échappé de l'Unicode.
L'exemple de décodage est le suivant :
Résultat :
짱벶믵색
est coréen~~
Plus de mises à jour
Après y avoir bien réfléchi, il pourrait s'agir d'un autre format d'encodage, alors j'ai essayé avec
gb2312
.Le résultat est :
Je pense que c'est plus fiable~
Ces méthodes sont disponibles dans urllib, à savoir :
quote
,unquote
Exemple :
Le résultat est :
Trois mises à jour
J'explique le principe~
Quand on ne sait pas
charset
, on ne peut que deviner ; les requêtes utilisent égalementchardet
pour deviner.De plus, ce que @ferstar a dit
req.encoding
est pour响应体(Response.content)
, pas pourheaders
.Avant que Asker ne fournisse le code et le lien Web, je ne pouvais utiliser que les données fournies par Asker :
Regardez bien, c'est un
字符串
, pas unbytes
! Doncreq.encoding
n'est pas valide.Comme je l'ai mentionné précédemment, il s'agit en fait d'un
URI
, qui est échappé d'un certain encodage du caractère original .%
est leURI
caractère d'échappement pour .J'ai déjà écrit la méthode de restauration ci-dessus, et le résultat est correct.
Pourquoi ne pas accepter la bonne réponse ?
Pourquoi ne pas accepter la bonne réponse ?
Pourquoi ne pas accepter la bonne réponse ?
Quatre
Je ne voulais pas mettre à jour ce post, mais @ferstar a fait un long commentaire, il serait donc inapproprié de ne pas répondre~
.Citation du commentaire de @ferstar, complété
Les mises à jour de contenu SF ont des enregistrements de versions historiques, consultez-les et comparez-les.
Demandeur : ider
Réponse : D'accord et accepter
Réponse : ferstar
3
heures après avoir mis à jour la bonne réponse #r3, @ider a mis à jour la question #r4 et采纳
republié la première version de @ferstar de la réponse incorrecte #r1.采纳
Après cela, j'ai soulevé l'objection dans les commentaires et @ferstar a mis à jour la deuxième version de la réponse #r2.De plus, la deuxième réponse de @ferstar est toujours fausse
Mais pourquoi la deuxième version de la réponse de @ferstar donne-t-elle le bon résultat ?
Parce que j'ai trouvé le bon encodage
gb2312
auparavant, il vient de le remplacer par un encodage compatiblegbk
.De plus,
req.encoding
ne peut pas agir surheaders
.Cette conclusion reste inchangée. Ceci est déterminé par le principe http,
headers
précèdebody
.Quant à la bonne façon d'écrire ce programme, j'ai la flemme de l'expliquer et de le mettre à jour, fatigué !
À moins que @ider ne réadopte ma réponse, je pourrais l'envisager~~
Votre nom de fichier est codé en utilisant gb2312, et votre décodage doit également être configuré pour décoder selon gb2312. S'il est décodé selon utf-8, des caractères tronqués apparaîtront. Peut-être avez-vous défini le décodage pour décoder selon utf-8 par défaut