Найти - Пользователи
Полная версия: Регулярные выражения re для поиска всех ссылок на странице
Начало » Python для экспертов » Регулярные выражения re для поиска всех ссылок на странице
1
esal
Привет всем!
Хочу узнать какие регулярки применяются для поиска всех ссылок на странице?

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

links = re.compile('<a\s*href=(.*?).*?>')
.Serj.
И не подойдёт. Мне думается, что проще использовать регулярку для 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/
esal
Да это видимо подойдет для всех возможных ссылок в вебе
Но мне местами не понятно здесь такие вот обороты (?#Protocol) и (?#Username:Password) и тд

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

А при использовании этого RE ничего не ищется :)
xa4a
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)]
o7412369815963
esal
А при использовании этого RE ничего не ищется :)
потому что этот ре для валидации емайлов, у него в начале и в конце для этогог спец.символы.
o7412369815963
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
Спасибо, начинаю по тихоньку разбираться с регуляркой уже
toksin
esal если работаете в windows, то поставьте себе программку http://www.ultrapico.com/Expresso.htm очень удобная вещь для создания регулярок.
Jenyay
Я использую вот такую регулярку. С ней были какие-то редкие проблемы, но в целом она справляется:

"([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. без явного указания протокола.
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