анализатор Python 3.2 html - PullRequest
       21

анализатор Python 3.2 html

4 голосов
/ 16 марта 2012

Я относительный новый питон, я пытаюсь 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, он ведет себя правильно. Может кто-нибудь сказать мне, что я делаю не так !!! спасибо

Ответы [ 3 ]

2 голосов
/ 12 ноября 2012

Это связано со строгим = Ложь.Когда strict = False, начальные обработчики не вызываются.Они вызываются, когда строгий = True.Это может быть ошибкой в ​​HTMLParser Python.Пример moul работает, поскольку он использует значение True по умолчанию для строгого.

1 голос
/ 16 марта 2012

Совет: сделайте это легко для себя и не используйте это. Попробуйте lxml.html , html5lib или BeautifulSoup

1 голос
/ 16 марта 2012

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

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>")
...