【问题标题】:HTMLParser does not parse the entire inputHTMLParser 不解析整个输入
【发布时间】:2015-02-04 13:22:00
【问题描述】:

我用python写了一些脚本,但从来没有真正接触过类。现在我需要一个,因为设置了一个 html 解析器(来自网络中的片段)。它工作正常,但缺少最后一个数据字符串。似乎该功能上次没有运行。

我的代码如下:

class MyHTMLParser(HTMLParser):
    def __init__(self):
        #reset
        self.reset()        
        #options
        self.strict = False
        self.convert_charrefs= True
        #create empty list for all my stored data
        self.fed = []               
    def handle_data(self, data):
        print ('D:', data)        #as you might see in output of a run, string after last tag is not added, because function did obviously not run
        self.fed.append('-'+data)
    def get_data(self):
        return ''.join(self.fed)

def process_description(desc):
    s = MyHTMLParser()
    s.feed(desc)
    return s.get_data()

text_html='first <br />second<br />third'
text=process_description(text_html)  
print (text)

输出:

D: first 
D: second
-first -second

函数 process_description() 未完全处理 text_html 字符串。从输出中可以看出,handle_data() 函数未处理最后一个 html 标记之后的子字符串(“第三个”)。一定有一些语法错误。怎么了?

【问题讨论】:

  • 能否请您澄清您的问题 - 究竟是什么问题?参见例如stackoverflow.com/help/mcve
  • 问题已编辑,感谢您的建议。

标签: class python-3.x html-parsing


【解决方案1】:

子类.__init__ 应该只调用基类.__init__,而不是复制您认为它所做的事情,并且只做额外的子类真正特定的事情。

def __init__(self):
    super().__init__(strict = False, convert_charrefs= True)
    #create empty list for all my stored data
    self.fed = []               

真正的问题是你在喂完饭后忘记调用 .close() 了。来自文档:“强制处理所有缓冲数据,就好像它后面跟一个文件结束标记一样。”

def process_description(desc):
    s = MyHTMLParser()
    s.feed(desc)
    s.close()  # <-- added #
    return s.get_data()

关闭后,结果就是你想要的和期望的。

D: first 
D: second
D: third
-first -second-third

(空格在输入中。)

【讨论】:

  • 感谢您解释我从网上复制和粘贴的这个非常基本的错误。我之前只是想知道,因为我认为,有一些关键字,如构造函数和析构函数。这些是终点站还是我又错了?您能否推荐该问题的另一个标题,以便对其他人有用和可以找到? (如已解决:HtmlParser,解析未完全完成。
  • 或“已解决:HTMLParser 不解析整个输入。” (另外,将答案标记为已接受;-)。 (我不明白“关键字...终端”中的问题。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多