from HTMLParser import HTMLParser
import urllib
# урл к страничке, откуда будем тянуть ссылки
BASE_URL = 'http://mail.ru/'
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"
Traceback (most recent call last):
File “D:/ff.py”, line 34, in <module>
parser.feed(urllib.urlopen(BASE_URL).read())
File “C:\Python27\lib\HTMLParser.py”, line 108, in feed
self.goahead(0)
File “C:\Python27\lib\HTMLParser.py”, line 148, in goahead
k = self.parse_starttag(i)
File “C:\Python27\lib\HTMLParser.py”, line 252, in parse_starttag
attrvalue = self.unescape(attrvalue)
File “C:\Python27\lib\HTMLParser.py”, line 390, in unescape
return re.sub(r"&(#??(?:+|\w{1,8}));“, replaceEntities, s)
File ”C:\Python27\lib\re.py", line 151, in sub
return _compile(pattern, flags).sub(repl, string, count)
UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xd1 in position 25: ordinal not in range(128)
Что удивительно, если ссылка будет python.su то все будет супер. Если поставить в моем ulr (http://mail.ru) в конце функции handle_starttag
def handle_starttag(self, tag, attrs):
''' Переопределяем метод HTMLParser (в базовом классе - метод ничего не делает)
Сам метод вызывается для обработки начала тега (фактически вызывается для каждого
начального тега при вызове метода "feed").
'''
attrs = dict(attrs)
# если находим тег 'a'
if 'a' == tag:
try:
#print attrs['href']
# записываем значение аттрибута href в список-свойство links нашего класса
self.links.append(attrs['href'])
except:
pass
for i in self.links
print i