【问题标题】:UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 6233: ordinal not in range(128)UnicodeDecodeError:“ascii”编解码器无法解码位置 6233 中的字节 0xf0:序数不在范围内(128)
【发布时间】:2017-05-04 13:18:34
【问题描述】:

我正在开发一个新项目,但我无法修复标题中的错误。

代码如下:

#!/usr/bin/env python3.5.2

import urllib.request , urllib.parse


def start(url):
    source_code = urllib.request.urlopen(url).read()
    info = urllib.parse.parse_qs(source_code)
    print(info)


start('https://www.youtube.com/watch?v=YfRLJQlpMNw')

【问题讨论】:

    标签: python python-3.x web-scraping


    【解决方案1】:

    发生错误是因为 .encode 适用于 unicode 对象。所以我们需要使用

    将字节字符串转换为 unicode 字符串
    .decode('unicode_escape')
    

    所以代码是:

    #!/usr/bin/env python3.5.2
    
    import urllib.request , urllib.parse
    
    
    def start(url):
        source_code = urllib.request.urlopen(url).read()
        info = urllib.parse.parse_qs(source_code.decode('unicode_escape'))
        print(info)
    
    
    start('https://www.youtube.com/watch?v=YfRLJQlpMNw')
    

    【讨论】:

      【解决方案2】:

      试试这个

      source_code = urllib.request.urlopen(url).read().decode('utf-8')
      

      【讨论】:

        【解决方案3】:

        错误消息是自我解释的:输入字符串中有一个字节 0xf0,它应该是一个 ascii 字符串。

        您应该给出确切的错误消息以及它发生在哪一行,但我猜想这是在 info = urllib.parse.parse_qs(source_code) 上发生的,因为 parse_qs 需要一个 unicode 字符串或一个 ascii 字节字符串。

        第一个问题是为什么你对来自 youtube 的数据调用 parse_qs,因为 Python 标准库的文档说:

        解析作为字符串参数给出的查询字符串(application/x-www-form-urlencoded 类型的数据)。数据作为字典返回。字典键是唯一的查询变量名称,值是每个名称的值列表。

        因此,您将在=& 字符上解析它,以将其解释为key1=value11&key2=value2&key1=value12 形式的查询字符串,以提供{ 'key1': [ 'value11', 'value12'], 'key2': ['value2']}

        如果您知道为什么要这样做,则应首先使用正确的编码将字节字符串解码为 un​​icode 字符串,或者如果不确定Latin1 能够接受任何字节:

        def start(url):
            source_code = urllib.request.urlopen(url).read().decode('latin1')
            info = urllib.parse.parse_qs(source_code)
            print(info)
        

        【讨论】:

          【解决方案4】:

          这段代码确实很奇怪。您正在使用查询解析器来解析网页的内容。 因此,您应该使用 this 之类的东西,而不是使用 parse_qs。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-24
            • 2011-05-13
            • 2014-02-19
            • 2018-07-26
            • 2020-11-06
            • 2014-08-12
            • 2018-05-13
            • 2013-09-20
            相关资源
            最近更新 更多