Python 如何正确编码urlopen中的字符串?

Python 如何正确编码urlopen中的字符串?,python,python-3.x,pycharm,urllib,Python,Python 3.x,Pycharm,Urllib,问题:我有一个用俄语写名字的文本文件。我从文本文件中提取每个名称,并以文本文件中的行作为页面标题,向Wikipidea发出请求。然后,我想在这个网站上的所有现有图像的信息 节目: with open('names-video.txt', "r", encoding='Windows-1251') as file: for line in file.readlines(): print(line)

问题:我有一个用俄语写名字的文本文件。我从文本文件中提取每个名称,并以文本文件中的行作为页面标题,向Wikipidea发出请求。然后,我想在这个网站上的所有现有图像的信息

节目:

    with open('names-video.txt', "r", encoding='Windows-1251') as file:
            for line in file.readlines():
                print(line)
                name = "_".join(line.split())
                print(name)
                html = urlopen(f'https://ru.wikipedia.org/wiki/{name}')
                bs = BeautifulSoup(html, 'html.parser')
                images = bs.findAll('img', {'src': re.compile('.jpg')})

                print(images[0])
error from callback <bound method SocketHandler.handle_message of <amino.socket.SocketHandler object at 0x0000018B92600FA0>>: 'ascii' codec can't encode characters in position 10-17: ordinal not in range(128)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\websocket\_app.py", line 344, in _callback
    callback(*args)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 80, in handle_message
    self.client.handle_socket_message(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\client.py", line 345, in handle_socket_message
    return self.callbacks.resolve(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 204, in resolve
    return self.methods.get(data["t"], self.default)(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 192, in _resolve_chat_message
    return self.chat_methods.get(key, self.default)(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 221, in on_text_message
    def on_text_message(self, data): self.call(getframe(0).f_code.co_name, objects.Event(data["o"]).Event)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 209, in call
    handler(data)
  File "C:\Users\1\Desktop\python-bots\music_bot\bot.py", line 56, in on_text_message
    html = urlopen(f'https://ru.wikipedia.org/wiki/{name}')
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 214, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 517, in open
    response = self._open(req, data)
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 534, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 494, in _call_chain
    result = func(*args)
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 1385, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 1342, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1255, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1266, in _send_request
    self.putrequest(method, url, **skips)
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1104, in putrequest
    self._output(self._encode_request(request))
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1184, in _encode_request
    return request.encode('ascii')
名称video.txt

Алимпиев, Виктор Гелиевич 
Андреев, Алексей Викторович (художник)
Баевер, Антонина
Булдаков, Алексей Александрович
Жестков, Максим Евгеньевич
Канис, Полина Владимировна
Мустафин, Денис Рафаилович
Преображенский, Кирилл Александрович
Селезнёв, Владимир Викторович
Сяйлев, Андрей Фёдорович
Шерстюк, Татьяна Александровна
错误消息:

    with open('names-video.txt', "r", encoding='Windows-1251') as file:
            for line in file.readlines():
                print(line)
                name = "_".join(line.split())
                print(name)
                html = urlopen(f'https://ru.wikipedia.org/wiki/{name}')
                bs = BeautifulSoup(html, 'html.parser')
                images = bs.findAll('img', {'src': re.compile('.jpg')})

                print(images[0])
error from callback <bound method SocketHandler.handle_message of <amino.socket.SocketHandler object at 0x0000018B92600FA0>>: 'ascii' codec can't encode characters in position 10-17: ordinal not in range(128)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\websocket\_app.py", line 344, in _callback
    callback(*args)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 80, in handle_message
    self.client.handle_socket_message(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\client.py", line 345, in handle_socket_message
    return self.callbacks.resolve(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 204, in resolve
    return self.methods.get(data["t"], self.default)(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 192, in _resolve_chat_message
    return self.chat_methods.get(key, self.default)(data)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 221, in on_text_message
    def on_text_message(self, data): self.call(getframe(0).f_code.co_name, objects.Event(data["o"]).Event)
  File "C:\Users\1\Desktop\ИНФА\pycharm\venv\lib\site-packages\amino\socket.py", line 209, in call
    handler(data)
  File "C:\Users\1\Desktop\python-bots\music_bot\bot.py", line 56, in on_text_message
    html = urlopen(f'https://ru.wikipedia.org/wiki/{name}')
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 214, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 517, in open
    response = self._open(req, data)
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 534, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 494, in _call_chain
    result = func(*args)
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 1385, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py", line 1342, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1255, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1266, in _send_request
    self.putrequest(method, url, **skips)
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1104, in putrequest
    self._output(self._encode_request(request))
  File "C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1184, in _encode_request
    return request.encode('ascii')
回调错误:“ascii”编解码器无法对位置10-17中的字符进行编码:序号不在范围内(128)
文件“C:\Users\1\Desktop\crmk hФА\pycharm\venv\lib\site packages\websocket\\ u app.py”,第344行,在回调中
回调(*args)
handle_消息中的文件“C:\Users\1\Desktop\imk hФА\pycharm\venv\lib\site packages\amino\socket.py”,第80行
self.client.handle\u socket\u消息(数据)
文件“C:\Users\1\Desktop\crmk hФА\pycharm\venv\lib\site packages\amino\client.py”,第345行,在handle\u socket\u消息中
返回self.callbacks.resolve(数据)
文件“C:\Users\1\Desktop\crmk hФА\pycharm\venv\lib\site packages\amino\socket.py”,第204行,解析
返回self.methods.get(数据[“t”],self.default)(数据)
文件“C:\Users\1\Desktop\imk hФА\pycharm\venv\lib\site packages\amino\socket.py”,第192行,在“解析”聊天信息中
返回self.chat_methods.get(key,self.default)(数据)
文件“C:\Users\1\Desktop\crmk hФА\pycharm\venv\lib\site packages\amino\socket.py”,第221行,在on_text_消息中
文本消息上的def(self,data):self.call(getframe(0).f_code.co_name,objects.Event(data[“o”]).Event)
调用中第209行的文件“C:\Users\1\Desktop\crmk_ФА\pycharm\venv\lib\site packages\amino\socket.py”
处理程序(数据)
文件“C:\Users\1\Desktop\python bots\music\u bot\bot.py”,第56行,在on\u text\u消息中
html=urlopen(f'https://ru.wikipedia.org/wiki/{name}')
文件“C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py”,urlopen中的第214行
返回opener.open(url、数据、超时)
文件“C:\Users\1\AppData\Local\Programs\Python39\lib\urllib\request.py”,第517行,打开
响应=自身打开(请求,数据)
文件“C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py”,第534行,处于打开状态
结果=self.\u调用\u链(self.handle\u打开,协议,协议+
文件“C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py”,第494行,在调用链中
结果=func(*args)
文件“C:\Users\1\AppData\Local\Programs\Python\Python39\lib\urllib\request.py”,第1385行,https\u open
返回self.do_open(http.client.HTTPSConnection,req,
文件“C:\Users\1\AppData\Local\Programs\Python\39\lib\urllib\request.py”,第1342行,在do\u open中
h、 请求(请求获取方法()、请求选择器、请求数据、标题、,
请求中的文件“C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py”,第1255行
self.\u发送\u请求(方法、url、正文、标题、编码\u分块)
文件“C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py”,第1266行,在发送请求中
putrequest(方法、url、**跳过)
putrequest中的文件“C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py”,第1104行
self.\u输出(self.\u编码\u请求(请求))
文件“C:\Users\1\AppData\Local\Programs\Python\Python39\lib\http\client.py”,第1184行,在编码请求中
返回请求。编码('ascii')

问题:由于某种原因,代码在
urlopen()
打印(行)和
打印(名称)时中断
工作正常。这里会有什么问题?我已经尝试解决这个问题很长时间了,我会感谢任何解决方案,谢谢提前。

您需要对非ASCII字符进行百分比编码,以使其成为正确的URI:

来自urllib.parse导入引号
...
name=“\”.join(line.split())
#对UTF-8字符进行百分比编码
名称=引用(名称)
印刷品(名称)
...

urllib.request是否有quote?
在“request.pyi”中找不到引用“quote”
?很抱歉,它在中。非常感谢,您的解决方案非常有用