【问题标题】: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']}。
如果您知道为什么要这样做,则应首先使用正确的编码将字节字符串解码为 unicode 字符串,或者如果不确定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。