recherche

Maison  >  Questions et réponses  >  le corps du texte

python 的requests问题

导入requests,提示报错 ''' UnicodeDecodeError: 'ascii' codec can't decode byte 0xc9 in position 1: ordinal not in range(128)'''
问题查了,一般是字符之间转换的。但是到了库这里,就不懂了什么原因。。。。
小生愚钝,请教各位老师,请指点一二,麻烦了。

导入BeautifulSoup,它是正常的。下面是报错的具体信息。

PS :不是本专业的,想学习一点计算机方面的。学个爬虫玩玩。英语比较菜。。。

Traceback (most recent call last):
  File "F:/untitled29/lianxi.py", line 5, in <module>
    import requests
  File "F:\Python27\lib\site-packages\requests\__init__.py", line 52, in <module>
    from .packages.urllib3.contrib import pyopenssl
  File "F:\Python27\lib\site-packages\requests\packages\urllib3\contrib\pyopenssl.py", line 47, in <module>
    from cryptography import x509
  File "F:\Python27\lib\site-packages\cryptography\x509\__init__.py", line 7, in <module>
    from cryptography.x509.base import (
  File "F:\Python27\lib\site-packages\cryptography\x509\base.py", line 16, in <module>
    from cryptography.x509.extensions import Extension, ExtensionType
  File "F:\Python27\lib\site-packages\cryptography\x509\extensions.py", line 14, in <module>
    from asn1crypto.keys import PublicKeyInfo
  File "F:\Python27\lib\site-packages\asn1crypto\keys.py", line 22, in <module>
    from ._elliptic_curve import (
  File "F:\Python27\lib\site-packages\asn1crypto\_elliptic_curve.py", line 51, in <module>
    from ._int import inverse_mod
  File "F:\Python27\lib\site-packages\asn1crypto\_int.py", line 56, in <module>
    from ._perf._big_num_ctypes import libcrypto
  File "F:\Python27\lib\site-packages\asn1crypto\_perf\_big_num_ctypes.py", line 31, in <module>
    libcrypto_path = find_library('crypto')
  File "F:\Python27\lib\ctypes\util.py", line 51, in find_library
    fname = os.path.join(directory, name)
  File "F:\Python27\lib\ntpath.py", line 85, in join
    result_path = result_path + p_path
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc9 in position 1: ordinal not in range(128)
迷茫迷茫2795 Il y a quelques jours1010

répondre à tous(5)je répondrai

  • PHP中文网

    PHP中文网2017-04-18 10:36:16

    Si vous voulez juste jouer, vous pouvez envisager d'utiliser Python3 directement. Par rapport à Python2, Python3 aura beaucoup moins de problèmes d'encodage de caractères.

    répondre
    0
  • 阿神

    阿神2017-04-18 10:36:16

    En regardant votre message d'erreur, il devrait y avoir un problème avec le format d'encodage de lanxi.py. Vous pouvez d'abord accéder à la console cmd et exécuter Python, puis importer pour essayer. Cela ne devrait pas être un problème avec les requêtes<🎜. >

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:36:16

    Le chemin du dossier du package de fonctions de cryptage SSL comporte des caractères spéciaux

    Changement vers py3, 2 a toujours divers problèmes de codage

    répondre
    0
  • 高洛峰

    高洛峰2017-04-18 10:36:16

    result_path = result_path + p_path 

    Vous pouvez les imprimer pour voir si les variables de ce code contiennent des caractères chinois, ou les enregistrer toutes sous forme Unicode

    result_path = u'xxx'
    p_path = u'xxx'
    或者 通过decode函数将变量转成unicode

    répondre
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:36:16

    UnicodeDecodeError est la raison pour laquelle le décodage des caractères échoue. Ce n'est pas seulement un problème avec requests, ni seulement un problème avec python. Tous les langages de programmation ont un tel "problème", c'est-à-dire. , le codage des caractères doit être compris. Le codage de caractères spécifique peut être interrogé pour obtenir des informations. Problème d'encodage des caractères dans py2 ci-dessous.

    Les types de chaînes déclarés avec des guillemets entre

    py2 sont tous str, et ceux déclarés avec un u devant la chaîne sont unicode. Les caractères transmis dans les E/S réseau et la lecture et l'écriture de fichiers sont tous codés en octets, c'est-à-dire en type str. Lorsqu'il est chargé dans l'ordinateur pour effectuer des calculs, il est généralement décodé en unicode. La méthode str de py2 est en fait ''.encode('ascii'), et la méthode unicode est ''.decode('ascii')

    In [1]: s = u'你好'
    
    In [2]: str(s)
    ---------------------------------------------------------------------------
    UnicodeEncodeError                        Traceback (most recent call last)
    <ipython-input-2-d22ffcdd2ee9> in <module>()
    ----> 1 str(s)
    
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    
    In [3]: s.decode('ascii')
    ---------------------------------------------------------------------------
    UnicodeEncodeError                        Traceback (most recent call last)
    <ipython-input-3-735804de5fd4> in <module>()
    ----> 1 s.decode('ascii')
    
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    
    In [4]: ss = '你好'
    
    In [5]: unicode(ss)
    ---------------------------------------------------------------------------
    UnicodeDecodeError                        Traceback (most recent call last)
    <ipython-input-5-6325006f91c2> in <module>()
    ----> 1 unicode(ss)
    
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
    
    In [6]: ss.decode('ascii')
    ---------------------------------------------------------------------------
    UnicodeDecodeError                        Traceback (most recent call last)
    <ipython-input-6-b5dcf2f3b46d> in <module>()
    ----> 1 ss.decode('ascii')
    
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
    
    In [7]: ss.decode('utf-8')
    Out[7]: u'\u4f60\u597d'
    
    In [8]: ss.decode('gbk')
    Out[8]: u'\u6d63\u72b2\u30bd'
    

    Parce que ss = '你好' est un caractère non ascii, le décodage de la manière ascii échoue. Lorsqu'il est décodé en utf-8 et gbk, il réussit. De même, s=u'你好' ne peut pas être codé dans ascii.

    Votre question ci-dessus doit concerner des caractères non ascii, et une erreur se produit lorsque decode devient un caractère ascii. result_path + p_path Autrement dit, l'une de ces deux variables est de type ascii contenant des caractères non str :

    In [1]: 'hello' + u'world'
    Out[1]: u'helloworld'
    
    In [2]: 'hello' + u'世界'
    Out[2]: u'hello\u4e16\u754c'
    
    In [3]: '你好' + u'世界'
    ---------------------------------------------------------------------------
    UnicodeDecodeError                        Traceback (most recent call last)
    <ipython-input-3-8c1827afc847> in <module>()
    ----> 1 '你好' + u'世界'
    
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
    
    In [4]: '你好' + '世界'
    Out[4]: '\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'
    
    In [5]: '你好' + '世界 world'
    Out[5]: '\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c world'
    
    In [6]: '你好' + u'世界 world'
    ---------------------------------------------------------------------------
    UnicodeDecodeError                        Traceback (most recent call last)
    <ipython-input-6-dcdf837ec675> in <module>()
    ----> 1 '你好' + u'世界 world'
    
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
    
    In [9]: '你好' + u'world'
    ---------------------------------------------------------------------------
    UnicodeDecodeError                        Traceback (most recent call last)
    <ipython-input-9-1be7bc8e74d5> in <module>()
    ----> 1 '你好' + u'world'
    
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
    Les caractères chinois dans

    '你好' ne sont pas des caractères ascii lorsqu'ils sont associés à des caractères Unicode, ils seront décodés en Unicode puis épissés. Pour le dernier exemple, '你好' + u'world', exécute en fait '你好'.decode('ascii') + u'world', donc une erreur est signalée.

    La méthode de correction est très simple, il suffit d'utiliser un codage de caractères unifié. Le codage par défaut de py sous Linux est utf-8, et il semble que ce soit gbk dans win. Quoi qu’il en soit, utilisez quand même utf-8.

    In [10]: '你好'.decode('utf-8') + u'world'
    Out[10]: u'\u4f60\u597dworld'

    Dans py3, toutes les chaînes déclarées entre guillemets sont unicode. Il n'y a pas deux types str et unicode. Parmi eux, str est codé en type bytes et bytes est décodé en type chaîne. Lors de la conversion entre les deux, il y aura toujours des UnicodeDecodeError problèmes. Ne pensez pas que tout ira bien avec py3. La clé pour résoudre le problème est de savoir comment encoder et décoder, et vous pouvez le résoudre une fois pour toutes. tous.

    >>> s = '中文'
    >>> s.encode('utf-8')
    b'\xe4\xb8\xad\xe6\x96\x87'
    >>> s.encode('ascii')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    >>> print(type(s.encode('utf-8')))
    <class 'bytes'>
    >>> print(type(s))
    <class 'str'>

    répondre
    0
  • Annulerrépondre