Найти - Пользователи
Полная версия: проблема с urllib.request
Начало » Python для новичков » проблема с urllib.request
1 2
Snowman8526
Добрый день. Решил переписать код с 2-го питона на 3-й и столкнулся с проблемой.
Было
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import urllib2
try:
    URL=urllib2.urlopen(now)
except urllib2.URLError:
    pass
except urllib2.HTTPError :
    pass
fail=open('musor.txt', 'w')
URL=URL.replace('','')
fail.write(URL)
for line in open ('musor.txt'):
...

сейчас переделал в такой вид.

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import urllib.request
try:
    URL=urllib.request.urlopen(now).read().decode('utf-8')
except urllib.request.URLError:
    pass
except urllib.request.HTTPError :
    pass
URL=URL.encode('utf-8')
fail=open('musor.txt', 'w', encoding='utf-8')
URL=URL.replace('','')
fail.write(URL)
for line in open ('musor.txt'):
...

что Я делаю не правильно? notpad пишет что кодировка (musor.txt) macintosh и replace не срабатывает корректно.
Написал только проблемную часть кода.
ошибка возникает на строчке (for line in open ('musor.txt')

File “C:\Python34\lib\encodings\cp1251.py”, line 23 in decode
UnicodeDecodeError: ‘charmap’ codec can't decode byte 0x98 in position 1539: character maps to <unicodefined>
terabayt
1) хранить страницу в переменной с названием URL не совсем логично
2)
URL=urllib.request.urlopen(now).read().decode('utf-8')
URL=URL.encode('utf-8')
эт тоже самое что
>>> a = b + 3
>>> a = a - 3
3)
URL=URL.replace('','')
эмм… :| даже не знаю что и сказать
4) перед тем как файл открывать его нужно закрыть
используйте или with или close
5) проблема с кодировкой
когда все это исправите попробуйте читать файл с указанием кодировки
J.R.
.
Snowman8526
terabayt
хранить страницу в переменной с названием URL не совсем логично

В моём понимании эта информация временная записывать её в файл бессмысленно. Хочу как можно меньше хранить на диске а работать с памятью

В python 2 urllib записывался как строка а в 3-м как файл? как с ним работать? Есть ли способ преобразовать его в строку? Этим проблема будет решена.

terabayt
перед тем как файл открывать его нужно закрыть
используйте или with или close
Да согласен просмотрел но на 2-м работало нормально. Исправлю
J.R.
.
Snowman8526
J.R.

Тогда Я совсем не чего не понимаю вот код собрал для тестирования
import urllib.request
try:
    URL=urllib.request.urlopen('http://www.yandex.ru').read().decode('utf-8')
except urllib.request.URLError:
    pass
except urllib.request.HTTPError :
    pass    
    #очистка от лишнего мусора файлы
fail=open('musor.txt', 'w', encoding='utf-8')
fail2=open('musor2.txt', 'w', encoding='utf-8')
    #приходит страница
for line in URL:        
    #ищем http и https и заменяем его на тоже самое только с переносом строки
    line=line.replace('"http:','\n http:')
    line=line.replace('"https:','\n https:')
    #записываем в фаил для следуещего цикла (по другому не получилось)
    fail.writelines(line)    
    #читаем из файла построчно    
    for line in open ('musor.txt'):
        #ищем место где заканчиваетс¤ http
        dobl=line.find('"')
        #очищаем всЄ что не ¤вл¤етс¤ ссылкой
        line=line[:dobl] + '\n'
        #записываю в файл
        fail2.writelines(line)    
fail.close()
fail2.close()
    #Если раньше закрою то в файле musot.txt будет только "<"
J.R.
.
Snowman8526
J.R.

Если бы на 2-м питоне у меня это не работало Я бы копался в коде. Может Я делал всё не правильно но он работал стабильно много дней подряд. 3-ий питон недоработан. urllib работает с огромным фризам в секунду. Приходится много лишней работы делать (перекодировать в разные форматы) раньше было логичнее.
py.user.next
Snowman8526
URL=urllib.request.urlopen(now).read().decode('utf-8')
Кодировку надо брать из ответа:
>>> import urllib.request
>>> 
>>> url = 'http://www.yandex.ru'
>>> 
>>> with urllib.request.urlopen(url) as data:
...     enc = data.info().get_content_charset('latin1')
...     text = data.read().decode(enc)
...     print(text[:100])
... 
<!DOCTYPE html><html class="i-ua_js_no i-ua_css_standart i-ua_browser_ i-ua_pseudo_yes" lang="ru"><h
>>>

Snowman8526
3-ий питон недоработан. urllib работает с огромным фризам в секунду. Приходится много лишней работы делать (перекодировать в разные форматы) раньше было логичнее.
Наоборот, второй питон - это каша-малаша в плане кодировок.

Snowman8526
Приходится много лишней работы делать (перекодировать в разные форматы) раньше было логичнее.
Ну, и не переходил бы, сидел бы там с сотней лишних функций типа range() и xrange(), input() и raw_input(), map() и itertools.imap(), zip() и itertools.izip(), регулярки там тоже через одно место. (А это всё же ещё надо учить и помнить наизусть.)
В общем, из третьего много всяких пережитков прошлого века выкинули.
J.R.
.
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