Найти - Пользователи
Полная версия: Подскажите, как парсить ссылки не сохраняя страницу в фал?
Начало » Python для новичков » Подскажите, как парсить ссылки не сохраняя страницу в фал?
1 2
ingfa_1981
[code python]
import urllib.request
import re
stranica = urllib.request.urlopen("http://www.mail.ru/").read()
f = open("Sot.html", "wb")
f.write(stranica)
f.close()
r = r'(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?'
#txt = u"""hi world!you url http://pravda-vsay.ya.ru/#y5__id37 and url http://google.com/"""
txt = open(r'Sot.html',"r").read()
for silki in re.findall(r, txt, re.U):
print(silki)
[/code]

Подскажите, как парсить ссылки не сохраняя страницу в фал?
sanodin
import urllib.request
import re
stranica = urllib.request.urlopen("http://www.mail.ru/").read()
r = r'(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?'
for silki in re.findall(r, str(stranica), re.U):
    print(silki)
ingfa_1981
А какой тип данных возвращает urllib.request.urlopen("http://www.mail.ru/").read(), что их нужно преобразовывать в строки?
sanodin
print type(stranica)
ingfa_1981
Поэтому у меня и не получилось, потому что там возвращались байты а нужны были строки. Спасибо за помощь
py.user.next
ingfa_1981
там возвращались байты а нужны были строки
её надо сначала раскодировать

>>> import urllib.request
>>> 
>>> data = urllib.request.urlopen('http://python.su/forum/topic/23714/')
>>> html = data.read().decode(data.headers.get_content_charset() or 'latin1')
>>> 
>>> import re
>>> re.search(r'там возвращались байты[^.]+', html).group()
'там возвращались байты а нужны были строки'
>>>

ingfa_1981
r = r'(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?'

это лучше записать в виде многословного регулярного выражения
python.org. re.X
ingfa_1981
А как авторизироваться на странице, или на каждой странице по разному? например на одноклассниках..
py.user.next
ingfa_1981
или на каждой странице по разному?
везде разные способы, их нужно сначала выяснять, а потом реализовывать
sanodin
from grab import Grab
g = Grab()
g.setup(post={"fr.posted": "set", "fr.needCaptcha": "", 'fr.login':'*************', 'fr.password':'***************',"button_login": "Войти"})
g.go("http://m.odnoklassniki.ru/dk?bk=GuestMain&st.cmd=main&_prevCmd=main&tkn=8520")
ingfa_1981
а как понять
sanodin
g.setup(post={“fr.posted”: “set”, “fr.needCaptcha”: “”, ‘fr.login’:'*************', ‘fr.password’:'***************',“button_login”: “Войти”})
куда этот пост запрос передается, ведь там две ссылки после? Страница авторизации, и список сообщений. Кстати чем их выловить?
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