Страницы

среда, 17 ноября 2010 г.

Люблю python :)

Захотелось мне распарсить документ html, порылся я в мануалах наткнулся на пару
модулей и выбрал HTMLParser. Скажу сраз до меня не сразу доперло, что надо сделать класс, унаследовав его от HTMLParser сделать что-то типа этого
from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):

def handle_starttag(self, tag, attrs):
print "Encountered the beginning of a %s tag" % tag

def handle_endtag(self, tag):
print "Encountered the end of a %s tag" % tag
А потом запустить его

p=MyHTMLParser()
p.feed('some text here')
Все хорошо, написал я свой класс, запустил, и получил что-то типа этого
HTMLParser instance has no attribute '[тут какой-то его внутренний атрибут]'

Гугл ответа не дал , а потом до меня дошло. Вообщем не надо переопределять конструктор класса, то есть если вы напишите примерно следующее

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
def __init__(self,d,f)
self.d='ss'
self.f='dd'

def handle_starttag(self, tag, attrs):
print "Encountered the beginning of a %s tag" % tag

def handle_endtag(self, tag):
print "Encountered the end of a %s tag" % tag
Вы начнете получать ту белеберду, думаю вы уже догадались в чем проблема - все дело в методе __init__ , который, как я понял , переопределяет базовый со всеми его атрибутами. Потому там надо добавить вызов super().

Комментариев нет: