Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2008 17:31:21

Leron
От:
Зарегистрирован: 2007-12-11
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получить все url со страницы?

Подскажите пожалуста как получить все ссылки из имеющегося html файла или страницы в нете? Мну осилил только ссылки на файлы - они заканчиваются удобно.



Офлайн

#2 Июнь 22, 2008 18:15:54

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Как получить все url со страницы?

Но ловит и такие урлы как “/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"

Отредактировано (Сен. 10, 2008 14:05:40)

Офлайн

#3 Июнь 22, 2008 18:48:45

Leron
От:
Зарегистрирован: 2007-12-11
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получить все url со страницы?

Спасибо за полезный скрипт!



Офлайн

#4 Июнь 22, 2008 19:26:30

Andity
От:
Зарегистрирован: 2008-02-22
Сообщения: 63
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получить все url со страницы?

Ferroman
готовое решение не интересно :)
расскажи как оно работает. а то есть некоторые мысли, но что-то не допонимаю.



Офлайн

#5 Июнь 22, 2008 20:21:27

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получить все url со страницы?

Как я понимаю, метод handle_starttag вызывается при обработки всех DOM сущностей. Там и вставляется проверка наличия тега a и берется содержимое его атрибута href. Все просто :)



Офлайн

#6 Июнь 22, 2008 21:05:43

Andity
От:
Зарегистрирован: 2008-02-22
Сообщения: 63
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получить все url со страницы?

Naota

Naota
метод handle_starttag вызывается при обработки всех DOM сущностей
спасибо, именно такого ответа и ожидал



Офлайн

#7 Июнь 22, 2008 21:20:43

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Как получить все url со страницы?

всех 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"

Отредактировано (Сен. 10, 2008 14:05:58)

Офлайн

#8 Июнь 23, 2008 08:31:19

BION
От:
Зарегистрирован: 2007-08-26
Сообщения: 62
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получить все url со страницы?

А можно ещё проще: у htmllib.HTMLParser есть свойиство anchorlist, т.е.

parser = htmllib.HTMLParser()
parser.feed(urllib.urlopen(BASE_URL).read())
print len(parser.anchorlist)



Офлайн

#9 Июнь 23, 2008 12:05:28

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Как получить все url со страницы?

Ммм, интересно, у меня в документации не нашёл.
Ага, это свойство есть в 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

Отредактировано (Сен. 10, 2008 14:06:25)

Офлайн

#10 Июнь 23, 2008 20:41:13

Yurietc
От:
Зарегистрирован: 2007-07-18
Сообщения: 112
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получить все url со страницы?

можно с помощью регекспов :

>>> 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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version