Найти - Пользователи
Полная версия: Как получить все url со страницы?
Начало » Python для экспертов » Как получить все url со страницы?
1 2
Leron
Подскажите пожалуста как получить все ссылки из имеющегося html файла или страницы в нете? Мну осилил только ссылки на файлы - они заканчиваются удобно.
Ferroman
Но ловит и такие урлы как “/ru/articles”. Можно добавить проверку на обязательное присутствие ‘http’.
from HTMLParser import HTMLParser
import urllib

BASE_URL = 'http://python.su/'

class UrlFinder(HTMLParser):

def __init__(self):
HTMLParser.__init__(self)
self.links = []

def handle_starttag(self, tag, attrs):
attrs = dict(attrs)
if 'a' == tag:
try:
self.links.append(attrs['href'])
except:
pass

print "Getting url list..."

parser = UrlFinder()
parser.feed(urllib.urlopen(BASE_URL).read())

print "Founded", len(parser.links), "urls"
Leron
Спасибо за полезный скрипт!
Andity
Ferroman
готовое решение не интересно :)
расскажи как оно работает. а то есть некоторые мысли, но что-то не допонимаю.
Naota
Как я понимаю, метод handle_starttag вызывается при обработки всех DOM сущностей. Там и вставляется проверка наличия тега a и берется содержимое его атрибута href. Все просто :)
Andity
Naota
Naota
метод handle_starttag вызывается при обработки всех DOM сущностей
спасибо, именно такого ответа и ожидал
Ferroman
всех DOM сущностей
Не знаю, всех ли, я только для тегов использовал.
готовое решение не интересно smile
расскажи как оно работает. а то есть некоторые мысли, но что-то не допонимаю.
Нет проблем :)
Вот код с комментариями:
from HTMLParser import HTMLParser
import urllib

# урл к страничке, откуда будем тянуть ссылки
BASE_URL = 'http://python.su/'

class UrlFinder(HTMLParser):
''' Класс-наследник HTMLParser.
'''
def __init__(self):
HTMLParser.__init__(self)
self.links = []

def handle_starttag(self, tag, attrs):
''' Переопределяем метод HTMLParser (в базовом классе - метод ничего не делает)
Сам метод вызывается для обработки начала тега (фактически вызывается для каждого
начального тега при вызове метода "feed").
'''
attrs = dict(attrs)
# если находим тег 'a'
if 'a' == tag:
try:
# записываем значение аттрибута href в список-свойство links нашего класса
self.links.append(attrs['href'])
except:
pass

print "Getting url list..."
# создаём экземпляр класса UrlFinder()
parser = UrlFinder()
# вызываем метод feed, который передаёт текст в parser.
# Сам текст получаем по ссылке с помощью функций библиотеки urllib
parser.feed(urllib.urlopen(BASE_URL).read())
# теперь считаем количество найденных ссылок (просто подсчитывая количество элементов в links нашго экзепляра класса UrlFinder())
print "Founded ", len(parser.links), "urls"
BION
А можно ещё проще: у htmllib.HTMLParser есть свойиство anchorlist, т.е.
parser = htmllib.HTMLParser()
parser.feed(urllib.urlopen(BASE_URL).read())
print len(parser.anchorlist)
Ferroman
Ммм, интересно, у меня в документации не нашёл.
Ага, это свойство есть в HTMLParser библиотеки htmllib, а я использовал отдельный класс HTMLParser.
Но запись все равно не правильная - не будет работать. htmllib.HTMLParser() требует обьект форматтера в виде аргумента.
Вот так - работатет:
#from HTMLParser import HTMLParser
import urllib
import htmllib
from formatter import NullFormatter

print "Getting url list..."
parser = htmllib.HTMLParser(NullFormatter())
parser.feed(urllib.urlopen('http://google.com').read())
print len(parser.anchorlist)
print parser.anchorlist
Yurietc
можно с помощью регекспов :
>>> import urllib2
>>> s=urllib2.urlopen('http://python.com.ua/forum/viewtopic.php?id=2264').read()
>>> import re
>>> o=re.compile('href="(.*?)"')
>>> l=o.findall(s)
>>> l[1]
'http://python.su/'
>>> len(l)
56
или BeautifulSoup :
import urllib2
>>> from BeautifulSoup import BeautifulSoup as BS
>>> s=urllib2.urlopen('http://python.com.ua/forum/viewtopic.php?id=2264').read()
>>> so=BS(s)
>>> f=so.findAll('a')
>>> for i in f:
	try:
		print i['href']
	except:
		pass
	
http://python.su/
index.php
...
>>> len(f)
56
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