【问题标题】:python 3.2 html parserpython 3.2 html解析器
【发布时间】:2012-03-16 08:37:49
【问题描述】:

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

【问题讨论】:

  • string=False 是什么意思?根据文档 HTMLParser 不接受参数。 t = new DanParser() 也是语法错误,您的缩进不正确。修复这些和你的例子对我有用。
  • 顺便说一句,如果这是真正的代码而不只是练习,您应该考虑使用 lxml python lib 进行 html 解析.. 并请求库而不是 urllib
  • @aquavitae: HTMLParser() has strict argument Python3.2 起
  • 我只是检查了你的链接,它的工作很有趣,但我可以确保它不能在我的电脑上工作。这可能是我的解释器或源代码文件文本编码的问题

标签: python html-parsing python-3.2


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    以下代码适用于我:

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

    【讨论】:

    • 我更改了 DanParser 的实现,但没有实现构造函数,它按预期工作,无论如何我都会尝试你的解决方案。我无法解释这个问题调用基类的方式。非常感谢大家
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 2020-04-17
      • 2012-11-25
      • 2011-06-21
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多