2012-03-16 3 views
4

Im относительный новый питон им пробуя html.parser, как лань:питона 3,2 HTML Parser

from html.parser import HTMLParser 
import urllib.request 


class TestParser(HTMLParser): 
    def handle_starttag(self, tag, attrs): 
     print("Start Tag: ", tag, attrs) 
    def handle_endtag(self, tag): 
     print("End Tag: ", tag) 
    def handle_data(self, data): 
     print("Data: ", data) 
    def handle_startendtag(self,tag,attrs): 
     print("StarEnd Tag: ", tag, attrs) 

class DanParser(HTMLParser): 
    def __init__(self): 
     super(DanParser, self).__init__(strict = False) 
     self.in_select = False 


    def handle_starttag(self, tag, attrs): 
     print("Start Tag: ", tag, attrs) 
     if tag == "select": 
      self.in_select = True 
      print("Start Tag: ", tag, attrs) 


    def handle_endtag(self, tag): 
     print("EndTag: ", tag) 
     if tag == "select" and self.in_select: 
      self.in_select = False 
      print("EndTag: ", tag) 


    def handle_data(self, data): 
     print("Data: ", data) 
     if self.in_select: 
      print("Data: ", data) 


    def handle_startendtag(self,tag,attrs): 
     print("StarEnd Tag: ", tag, attrs) 

Когда я сделать в интерпретаторе

t = new DanParser() 
t.feed("<select>test</select>") 

им получать:

Data: <select> 
Data: test 
EndTag: select 

метод handle_starttag не вызывается, но когда я делаю это, используя TestParser, он ведет себя корректно. Может ли кто-нибудь сказать мне, что я делаю неправильно? благодаря

+0

Что означает 'string = False'? Согласно документам HTMLParser не принимает аргументов. Также 't = new DanParser()' является синтаксической ошибкой, а ваш отступ неверен. Исправление этих и ваших примеров работает для меня. – aquavitae

+0

BTW, если это реальный код, а не просто практика, вы должны рассмотреть возможность использования lxml python lib для разбора html .. и запрашивает библиотеку вместо urllib. – alonisser

+0

@aquavitae: ['HTMLParser()' имеет 'strict' аргумент] (http://docs.python.org/dev/library/html.parser.html?highlight=htmlparser#html.parser.HTMLParser) с Python3.2 – jfs

ответ

1

Следующий код работает для меня:

from HTMLParser import HTMLParser 

class DanParser(HTMLParser): 
    def __init__(self): 
     HTMLParser.__init__(self) 
     self.in_select = False 

    def handle_starttag(self, tag, attrs): 
     print("Start Tag: ", tag, attrs) 
     if tag == "select": 
      self.in_select = True 
      print("Start Tag: ", tag, attrs) 

    def handle_endtag(self, tag): 
     print("EndTag: ", tag) 
     if tag == "select" and self.in_select: 
      self.in_select = False 
      print("EndTag: ", tag) 

    def handle_data(self, data): 
     print("Data: ", data) 
     if self.in_select: 
      print("Data: ", data) 

    def handle_startendtag(self,tag,attrs): 
     print("StarEnd Tag: ", tag, attrs) 

t = DanParser() 
t.feed("<select>test</select>") 
+0

. Я изменил реализацию DanParser с внедрением конструктора и работает так, как ожидалось, любым способом я попробую ваше решение. Я не могу объяснить, как эта проблема вызывает базовый класс. Благодарю вас всех. – yehezkel

2

Это связано со строгим = ложь. Когда strict = False, начальные обработчики не вызываются. Их вызывают, когда strict = True. Это может быть ошибка в HTMLParser python. пример moul работает, поскольку он использует значение True по умолчанию для строгих.