Форум сайта python.su
Добрый день, так хочется разобраться с классами. Посмотрела
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"
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
Отредактировано (Июнь 7, 2011 10:46:37)
Офлайн
Мне выкидывает: HTMLParseError: malformed start tag, at line 142, column 127
Но теоретически попробуйте декодировать принятые данные:
parser.feed(urllib.urlopen(BASE_URL).read().decode('cp1251'))
Офлайн
Сделала по вашему-)
Traceback (most recent call last):
File “D:\ff.py”, line 35, in <module>
parser.feed(urllib.urlopen(url).read().decode('windows-1251'))
File “C:\Python26\lib\HTMLParser.py”, line 108, in feed
self.goahead(0)
File “C:\Python26\lib\HTMLParser.py”, line 150, in goahead
k = self.parse_endtag(i)
File “C:\Python26\lib\HTMLParser.py”, line 317, in parse_endtag
self.error(“bad end tag: %r” % (rawdata,))
File “C:\Python26\lib\HTMLParser.py”, line 115, in error
raise HTMLParseError(message, self.getpos())
HTMLParseError: bad end tag: u“</scr'+'ipt>”, at line 2119, column 100
Сейчас такая ошибка….Что делать?
Офлайн
Насколько я понимаю это говорит о невалидном HTML…
Учитывая что повторить ее я не могу, незнаю… искать инфу, читать доки.
может с HTMLparser.CDATA_CONTENT_ELEMENTS поиграться.
Офлайн