【发布时间】:2021-03-13 10:34:25
【问题描述】:
我正在尝试对图像的链接进行网络抓取,以便在我的 Kivy 应用程序中使用它。问题是图像地址中有波兰语符号(ę,ł,ó,ą),我收到此错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-37: ordinal not in range(128)
完整的错误回溯:
Traceback (most recent call last):
File "F:\Kivy\lib\site-packages\kivy\loader.py", line 342, in _load_urllib
fd = opener.open(request)
File "c:\users\user\appdata\local\programs\python\python36\lib\urllib\request.py", line 526, in open
response = self._open(req, data)
File "c:\users\user\appdata\local\programs\python\python36\lib\urllib\request.py", line 544, in _open
'_open', req)
File "c:\users\user\appdata\local\programs\python\python36\lib\urllib\request.py", line 504, in _call_chain
result = func(*args)
File "c:\users\user\appdata\local\programs\python\python36\lib\urllib\request.py", line 1361, in https_open
context=self._context, check_hostname=self._check_hostname)
File "c:\users\user\appdata\local\programs\python\python36\lib\urllib\request.py", line 1318, in do_open
encode_chunked=req.has_header('Transfer-encoding'))
File "c:\users\user\appdata\local\programs\python\python36\lib\http\client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
File "c:\users\user\appdata\local\programs\python\python36\lib\http\client.py", line 1250, in _send_request
self.putrequest(method, url, **skips)
File "c:\users\user\appdata\local\programs\python\python36\lib\http\client.py", line 1117, in putrequest
self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode character '\u0142' in position 36: ordinal not in range(128)
[INFO ] [GL ] NPOT texture support is available
[INFO ] [WindowSDL ] exiting mainloop and closing.
[INFO ] [Base ] Leaving application in progress...
Process finished with exit code 0
这是一个例子,你可以明白我的意思。图片加载正常,没有错误,第二个输出UnicodeEncodeError并显示黑色。
from kivy.app import App
from kivy.lang import Builder
build_structure = """
Screen:
BoxLayout:
AsyncImage:
# This doesnt load because it's in UTF-8 and outputs the error above
# but it doesn't break the app.
source: app.link_to_image_bad
AsyncImage:
# This one does load
source: app.link_to_image_good
"""
class ImageApp(App):
# This link has Polish signs in it so it will give the UnicodeEncodeError
link_to_image_bad = "https://nowa.1lo.gorzow.pl/wp-content/uploads/2020/11/Szkoła-do-hymnu.png"
link_to_image_good = "https://nowa.1lo.gorzow.pl/wp-content/uploads/2020/11/Olimpiada-statystyczna.png"
def build(self):
return Builder.load_string(build_structure)
if __name__ == '__main__':
ImageApp().run()
上面代码的输出:
有没有办法避免这个错误并且仍然有一个功能链接?
【问题讨论】:
-
不清楚代码的哪一部分试图将其重新编码为 ASCII,或者为什么。有什么理由不简单地将其保存在 Unicode 中吗?也许添加完整的回溯会很有用。
-
我上面的代码,没有部分尝试将其重新编码为 ASCII,因为我不知道该怎么做,这就是我问这个问题的原因。它不能保存在 UTF-8 中,因为它会给出错误
UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-37: ordinal not in range(128)。 -
您可以对链接进行 URL 编码,以便它们是纯 ASCII,但仍能被服务器正确解释。您必须进行一些试验,但可能假设他们使用 UTF-8 作为 URL 编码。
from urllib.parse import quote_plus; url = quote_plus(url) -
很遗憾,当我尝试使用你的方法时,我仍然遇到同样的错误
标签: python beautifulsoup utf-8 kivy kivymd