Форум сайта python.su
Привет всем!
Хочу узнать какие регулярки применяются для поиска всех ссылок на странице?
Вот этот вариант не подходит
links = re.compile('<a\s*href=(.*?).*?>')
Офлайн
И не подойдёт. Мне думается, что проще использовать регулярку для 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})*)?$
Офлайн
Да это видимо подойдет для всех возможных ссылок в вебе
Но мне местами не понятно здесь такие вот обороты (?#Protocol) и (?#Username:Password) и тд
Мне нужно пропарсить ссылки с блогов
Например с таких http://pravda-vsay.ya.ru/#y5__id37
А при использовании этого 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)]
Офлайн
esalпотому что этот ре для валидации емайлов, у него в начале и в конце для этогог спец.символы.
А при использовании этого 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']
Офлайн
Спасибо, начинаю по тихоньку разбираться с регуляркой уже
Офлайн
esal если работаете в windows, то поставьте себе программку http://www.ultrapico.com/Expresso.htm очень удобная вещь для создания регулярок.
Офлайн
Я использую вот такую регулярку. С ней были какие-то редкие проблемы, но в целом она справляется:
"([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_\\$\\+\\!\\*\\(\\):@&=\\?/~\\#\\%])?)?"
[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}|
Отредактировано (Март 7, 2011 10:27:39)
Офлайн