Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 30, 2013 09:04:29

Stepe
Зарегистрирован: 2013-09-03
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeEncodeError

Добрый день.
Столкнулся с проблеммой, написал скрипт который выгружает архив погоды с 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')

Буду благодарен за помощь.
Спасибо.

Отредактировано Stepe (Окт. 30, 2013 09:04:52)

Офлайн

#2 Окт. 30, 2013 09:21:57

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

UnicodeEncodeError

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

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

Переводи байты сразу же в юникод, как только они попали в программу



Отредактировано Budulianin (Окт. 30, 2013 10:02:22)

Офлайн

#3 Окт. 30, 2013 10:14:58

Stepe
Зарегистрирован: 2013-09-03
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeEncodeError

Выкидывает следующую ошибку :

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'

Офлайн

#4 Окт. 30, 2013 10:17:02

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

UnicodeEncodeError

Stepe
Выкидывает следующую ошибку :
укажи в open кодировку файла

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

только свою кодировку укажи



Отредактировано Budulianin (Окт. 30, 2013 10:18:10)

Офлайн

#5 Окт. 30, 2013 10:23:45

Stepe
Зарегистрирован: 2013-09-03
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeEncodeError

Таже ошибка что и была.

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)

Офлайн

#6 Окт. 30, 2013 10:27:52

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

UnicodeEncodeError

У тебя что в файле cod1 ?

У меня скрипт таких ошибок не выдаёт



Отредактировано Budulianin (Окт. 30, 2013 11:45:04)

Офлайн

#7 Окт. 30, 2013 10:30:57

Stepe
Зарегистрирован: 2013-09-03
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeEncodeError

Файл прикрепляю.

Прикреплённый файлы:
attachment cod1.txt (434 байта)

Офлайн

#8 Окт. 30, 2013 11:16:57

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

UnicodeEncodeError

Python ругается вот на это

urllib.request.urlopen(url, data = data_script)

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

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

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



Отредактировано Budulianin (Окт. 30, 2013 11:45:32)

Офлайн

#9 Окт. 30, 2013 11:54:23

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

UnicodeEncodeError

Решение проблемы

from urllib.parse   import quote
from urllib.request import urlopen
url = 'http://rp5.ru/' + quote('Погода_в_Перми')
urlopen(url)



Отредактировано Budulianin (Окт. 30, 2013 11:59:01)

Офлайн

#10 Окт. 30, 2013 12:38:04

Stepe
Зарегистрирован: 2013-09-03
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeEncodeError

А если мне необходимо в цикле это все делать, а там 64 разных региона?
По другому никак не получится, да?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version