4

我是相对新的 python 我正在尝试 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 执行它时,它的行为正确。谁能告诉我我做错了什么!!!谢谢

4

3 回答 3

2

这是由于 strict=False。当 strict=False 时,不调用启动处理程序。当 strict=True 时调用它们。这可能是 python 的 HTMLParser 中的一个错误。moul 的示例有效,因为他使用默认的 True 值表示严格。

于 2012-11-12T16:30:45.123 回答
1

提示:让自己轻松一点,不要使用它。尝试lxml.htmlhtml5libBeautifulSoup

于 2012-03-16T19:13:08.350 回答
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>")
于 2012-03-16T10:38:06.537 回答