Форум сайта python.su
0
Добрый день.
Столкнулся с проблеммой, написал скрипт который выгружает архив погоды с 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)
Офлайн
33
У тебя строка t = h.strip() возвращает байты
вставляется в dataaa
потом
dataaa.encode('cp1251')
т.е. кодируется юникод кодировкой cp1251, а там байты вставлены, а должен быть только юникод
По-моему в этом причина
Переводи байты сразу же в юникод, как только они попали в программу
Отредактировано Budulianin (Окт. 30, 2013 10:02:22)
Офлайн
0
Выкидывает следующую ошибку :
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'
Офлайн
33
Stepeукажи в open кодировку файла
Выкидывает следующую ошибку :
open('cod1.txt', encoding='utf-8')
Отредактировано Budulianin (Окт. 30, 2013 10:18:10)
Офлайн
0
Таже ошибка что и была.
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)
Офлайн
33
У тебя что в файле cod1 ?
У меня скрипт таких ошибок не выдаёт
Отредактировано Budulianin (Окт. 30, 2013 11:45:04)
Офлайн
0
Файл прикрепляю.
Прикреплённый файлы:
cod1.txt (434 байта)
Офлайн
33
Python ругается вот на это
urllib.request.urlopen(url, data = data_script)
Отредактировано Budulianin (Окт. 30, 2013 11:45:32)
Офлайн
33
Решение проблемы
from urllib.parse import quote from urllib.request import urlopen url = 'http://rp5.ru/' + quote('Погода_в_Перми') urlopen(url)
Отредактировано Budulianin (Окт. 30, 2013 11:59:01)
Офлайн
0
А если мне необходимо в цикле это все делать, а там 64 разных региона?
По другому никак не получится, да?
Офлайн