Python中通过BeautifulSoup解析文件地址后,使用urllib下载时遇到ASCII编码错误,如何解决?
用的 py3,从 uci 上自动下载需要的 whl 文件,通过 bs 解析得到的文件名,在 pycharm 里打印出来为 rasterio‑1.0.24+gdal24‑cp35‑cp35m‑win32.whl
通过 urllib.request.urlretrieve 下载时报错,提示 UnicodeEncodeError: 'ascii' codec can't encode character '\u2011' in position 34: ordinal not in range(128)
查了下这个\u2011 是文件名中的-, 尝试了一下新建 encoding='utf-8'的 txt 文件,写入该文件名字符串,可写入; 新建 encoding='cp936'的 txt 文件,写入文件名字符串会报错。
不知道怎么解决了,请教
Python中通过BeautifulSoup解析文件地址后,使用urllib下载时遇到ASCII编码错误,如何解决?
2 回复
遇到ASCII编码错误,通常是因为URL中包含非ASCII字符(比如中文)。urllib的早期版本对Unicode支持不够好。这里有几种解决方案:
方案1:使用urllib.parse.quote()对URL进行编码(推荐)
from urllib.request import urlopen, urlretrieve
from urllib.parse import quote
from bs4 import BeautifulSoup
import requests
# 假设从BeautifulSoup获取到包含中文的URL
url = "http://example.com/文件.pdf"
# 对URL进行编码
encoded_url = quote(url, safe=':/?&=')
# 下载文件
urlretrieve(encoded_url, "downloaded_file.pdf")
方案2:使用requests库(更简单)
import requests
from bs4 import BeautifulSoup
url = "http://example.com/文件.pdf"
response = requests.get(url, stream=True)
with open("downloaded_file.pdf", 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
方案3:手动处理URL编码
from urllib.request import urlopen
from urllib.parse import urlparse, urlunparse
import urllib
url = "http://example.com/文件.pdf"
parsed = urlparse(url)
encoded_path = urllib.parse.quote(parsed.path)
encoded_url = urlunparse(parsed._replace(path=encoded_path))
# 然后使用encoded_url下载
简单总结:用requests库或对URL进行编码处理。

