2015-05-16 21 views
2
class MyHTMLParser(HTMLParser): 

    b1 = False 

    def handle_starttag(self, tag, attrs): 
     if tag =="ul": 
      self.b1 = True 

    def handle_data(self, data): 
     if self.b1: 
      print(data) 
      self.b1 = False 

parser = MyHTMLParser() 

parser.feed('<ul class="player-metadata floatleft"></ul><p>Gros caca</p><p>Zuul</p>') 

我想<ul class="player-metadata floatleft"></ul>这是空之间提取数据之间的提取物“空”的数据。然而,即使我举报的<ul>标签,该handle_data函数打印<ul class="player-metadata floatleft"></ul>后找到的第一个数据:Python的HTMLParser的 - 两个标签

“格罗斯CACA”

我想打印的“一无所有”和len(data)返回0

你能帮我吗?我也不允许使用BeautifulSoup。

回答

2

这几乎是this question的重复。

这样做是为了保住开始标记,每当一个标签处理包含的数据,然后使用这些做事的时候解析器处理结束标签,就像这样:

class MyHTMLParser(HTMLParser): 
    _data = '' 
    _starttag = '' 

    def handle_starttag(self, tag, attrs): 
     self._starttag = tag 

    def handle_data(self, data): 
     self._data = data 

    def handle_endtag(self, tag): 
     if self._starttag == 'ul' and self._data == '': 
      print('nothing') 
     elif (...): 
      (...) 
     else: 
      print(self._data) 

这将处理空字符串并返回0len(self._data)

+0

非常感谢。我希望我能够upvote你的答案! 另外我相信你的意思是打印(self._data)的最后一行。 – connie246

+0

是的,但你明白了。 ;) 很高兴我能帮上忙。 –

+0

我相信即使评分较低,您也可以接受答案,这会从问题中删除[tag:unanswered]标签。 –