Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 8, 2011 00:33:16

esal
От:
Зарегистрирован: 2010-10-20
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения re для поиска всех ссылок на странице

Привет всем!
Хочу узнать какие регулярки применяются для поиска всех ссылок на странице?

Вот этот вариант не подходит

links = re.compile('<a\s*href=(.*?).*?>')



Офлайн

#2 Янв. 8, 2011 09:00:49

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

Регулярные выражения re для поиска всех ссылок на странице

И не подойдёт. Мне думается, что проще использовать регулярку для URL, а не выдёргивать всё из href'ов:

^(?#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})*)?$
© http://flanders.co.nz/2009/11/08/a-good-url-regular-expression-repost/



Офлайн

#3 Янв. 8, 2011 13:56:08

esal
От:
Зарегистрирован: 2010-10-20
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения re для поиска всех ссылок на странице

Да это видимо подойдет для всех возможных ссылок в вебе
Но мне местами не понятно здесь такие вот обороты (?#Protocol) и (?#Username:Password) и тд

Мне нужно пропарсить ссылки с блогов
Например с таких http://pravda-vsay.ya.ru/#y5__id37

А при использовании этого RE ничего не ищется :)



Офлайн

#4 Янв. 15, 2011 11:04:38

xa4a
От:
Зарегистрирован: 2008-05-28
Сообщения: 12
Репутация: +  1  -
Профиль   Отправить e-mail  

Регулярные выражения re для поиска всех ссылок на странице

import urllib

from BeautifulSoup import BeautifulSoup


soup = BeautifulSoup(urllib.urlopen('http://www.google.com/'))

print [dict(a.attrs)['href'] for a in soup('a') if 'href' in dict(a.attrs)]



Офлайн

#5 Янв. 15, 2011 18:44:56

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Регулярные выражения re для поиска всех ссылок на странице

esal
А при использовании этого RE ничего не ищется :)
потому что этот ре для валидации емайлов, у него в начале и в конце для этогог спец.символы.

Офлайн

#6 Янв. 15, 2011 18:50:10

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Регулярные выражения re для поиска всех ссылок на странице

o7412369815963
esal
А при использовании этого RE ничего не ищется :)
потому что этот ре для валидации емайлов, у него в начале и в конце для этогог спец.символы.
вот отрезал - терь ищет
# coding: utf8

import re

r = ur'(?#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 google.com
"""

print re.findall(r, txt, re.U)
[u'http://pravda-vsay.ya.ru/#y5__id37', u'google.com']

Офлайн

#7 Янв. 15, 2011 23:35:44

esal
От:
Зарегистрирован: 2010-10-20
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения re для поиска всех ссылок на странице

Спасибо, начинаю по тихоньку разбираться с регуляркой уже



Офлайн

#8 Янв. 24, 2011 20:02:29

toksin
От:
Зарегистрирован: 2010-09-09
Сообщения: 31
Репутация: +  -1  -
Профиль   Отправить e-mail  

Регулярные выражения re для поиска всех ссылок на странице

esal если работаете в windows, то поставьте себе программку http://www.ultrapico.com/Expresso.htm очень удобная вещь для создания регулярок.



Офлайн

#9 Март 7, 2011 10:25:42

Jenyay
От:
Зарегистрирован: 2007-08-10
Сообщения: 173
Репутация: +  1  -
Профиль   Отправить e-mail  

Регулярные выражения re для поиска всех ссылок на странице

Я использую вот такую регулярку. С ней были какие-то редкие проблемы, но в целом она справляется:

"([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}|(((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)\\.)[-A-Za-z0-9\\.]+[-A-Za-z0-9]+)(:[0-9]*)?(/([-A-Za-z0-9_,\\$\\.\\+\\!\\*\\(\\):@&=\\?/~\\#\\%]*[-A-Za-z0-9_\\$\\+\\!\\*\\(\\):@&=\\?/~\\#\\%])?)?"
Эта же регулярка ищет и адрес в виде IP. Если этого не надо, то можно выкинуть первую часть

[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}|
PS. Да, и еще эта регулярка ищет адреса, начинающиеся с www. и ftp. без явного указания протокола.



Отредактировано (Март 7, 2011 10:27:39)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version