Найти - Пользователи
Полная версия: UnicodeEncodeError
Начало » Python для новичков » UnicodeEncodeError
1 2
Stepe
Добрый день.
Столкнулся с проблеммой, написал скрипт который выгружает архив погоды с rp5.
Есть файлик в котором находятся коды городов.
При выполнении скрипт первых 3 кода прочитывает а на следующем вылетает ошибка
UnicodeEncodeError: 'ascii' codec can't encode characters in position 18-29: ordinal not in range(128)

Вот сам код скрипта

import re
import urllib.parse
from urllib.parse import urljoin
import urllib.request as req
import urllib
import os
cod = open('cod1.txt'.rstrip(),'r')
url = 'http://rp5.ru/inc/f_archive.php'
for h in cod:
  t = h.strip()
  
 
  dataaa = 'wmo_id={}&f_ed0=14&f_ed1=10&f_ed2=2013&f_ed3=1&f_ed4=0&f_ed5=0&f_ed6=21&f_ed7=10&f_ed8=2013&f_pe=1&f_pe1=1&lng_id=2'.format(t)
  data_script = dataaa.encode('cp1251')
  with urllib.request.urlopen(url,data = data_script) as data:
    arch = re.findall(r'<a href=([^<]*?)>',data.read().decode('cp1251'))[0]
    
    arch1 = urljoin(url,arch)
    print(arch1)
    with urllib.request.urlopen(arch1)as archdata,open(t,'wb')as fout:
                    fout.write(archdata.read())
                    fout.close()
    print(t, '=ok')
                   
                    
  
                    
print (t , ' = ok')

Буду благодарен за помощь.
Спасибо.
Budulianin
У тебя строка t = h.strip() возвращает байты
вставляется в dataaa
потом
dataaa.encode('cp1251')
т.е. кодируется юникод кодировкой cp1251, а там байты вставлены, а должен быть только юникод

По-моему в этом причина

Переводи байты сразу же в юникод, как только они попали в программу
Stepe
Выкидывает следующую ошибку :
Traceback (most recent call last):
  File "C:\Python32\arhiv_pogodi", line 18, in <module>
    t=t.decode('cp1251')
AttributeError: 'str' object has no attribute 'decode'
Budulianin
Stepe
Выкидывает следующую ошибку :
укажи в open кодировку файла

open('cod1.txt', encoding='utf-8')

только свою кодировку укажи
Stepe
Таже ошибка что и была.
37031 =ok
22550 =ok
34880 =ok
Traceback (most recent call last):
  File "C:\Python32\arhiv_pogodi", line 22, in <module>
    with urllib.request.urlopen(url,data = data_script) as data:
  File "C:\Python32\lib\urllib\request.py", line 138, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python32\lib\urllib\request.py", line 372, in open
    response = meth(req, response)
  File "C:\Python32\lib\urllib\request.py", line 484, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python32\lib\urllib\request.py", line 404, in error
    result = self._call_chain(*args)
  File "C:\Python32\lib\urllib\request.py", line 344, in _call_chain
    result = func(*args)
  File "C:\Python32\lib\urllib\request.py", line 579, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "C:\Python32\lib\urllib\request.py", line 366, in open
    response = self._open(req, data)
  File "C:\Python32\lib\urllib\request.py", line 384, in _open
    '_open', req)
  File "C:\Python32\lib\urllib\request.py", line 344, in _call_chain
    result = func(*args)
  File "C:\Python32\lib\urllib\request.py", line 1140, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "C:\Python32\lib\urllib\request.py", line 1122, in do_open
    h.request(req.get_method(), req.selector, req.data, headers)
  File "C:\Python32\lib\http\client.py", line 964, in request
    self._send_request(method, url, body, headers)
  File "C:\Python32\lib\http\client.py", line 992, in _send_request
    self.putrequest(method, url, **skips)
  File "C:\Python32\lib\http\client.py", line 856, in putrequest
    self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 18-29: ordinal not in range(128)
Budulianin
У тебя что в файле cod1 ?

У меня скрипт таких ошибок не выдаёт
Stepe
Файл прикрепляю.
Budulianin
Python ругается вот на это
urllib.request.urlopen(url, data = data_script)

По-моему из-за этого бага

Видимо по тем запросам пересылают на url с кириллицей, а urllib.request.urlopen так на неё реагирует

там url такого типа, на сайте: http://rp5.ru/Погода_в_Перми
Budulianin
Решение проблемы

from urllib.parse   import quote
from urllib.request import urlopen
url = 'http://rp5.ru/' + quote('Погода_в_Перми')
urlopen(url)
Stepe
А если мне необходимо в цикле это все делать, а там 64 разных региона?
По другому никак не получится, да?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB