Python 从HTMLPasser获取HTML子树

Python 从HTMLPasser获取HTML子树,python,python-2.7,html-parsing,Python,Python 2.7,Html Parsing,实际上,我正在使用HTMLparser for python,我正在尝试获取包含在特定节点中的HTML子树。 我有一个通用解析器做得很好,一旦找到了有趣的标记,我想用这个节点中的数据为另一个特定的HTMLParser提供数据 这是我想做的一个例子: class genericParser(HTMLParser): def __init__ (self): HTMLParser.__init__(self) self.divFound = False de

实际上,我正在使用HTMLparser for python,我正在尝试获取包含在特定节点中的HTML子树。 我有一个通用解析器做得很好,一旦找到了有趣的标记,我想用这个节点中的数据为另一个特定的HTMLParser提供数据

这是我想做的一个例子:

class genericParser(HTMLParser):
   def __init__ (self):
       HTMLParser.__init__(self)
       self.divFound = False

   def handle_starttag (self, tag, attrs):
       if tag == "div" and ("class", "good") in attrs:
           self.divFound = True

   def handle_data (self, data):
       if self.divFound:
           print data    ## print nothing
           parser = specificParser ()
           parser.feed (data)
           self.divFound = False
并向genericParser提供如下内容:

<html>
<head></head>
<body>
   <div class='good'>
      <ul>
         <li>test1</li>
         <li>test2</li>
      </ul>
   </div>
</body>
</html>

  • 测试1
  • 测试2
但是在HTMLParser.handle_数据的python文档中:

调用此方法可处理任意数据(例如,文本节点和
..
..
的内容

在my
genericParser
中,由于my
不是文本节点,因此在
handle\u data
中获取的数据为空

如何使用HTMLParser检索div中的原始HTML数据


提前感谢

我通过缓冲有趣的HTML节点中遇到的所有数据解决了这个问题

这一个可以工作,但不是很“干净”,因为GenericParser必须在向SpecificParser提供之前解析整个有趣的块。 以下是一个“轻”(无任何错误处理)解决方案:

class genericParser(HTMLParser):
   def __init__ (self):
       HTMLParser.__init__ (self)
       self.divFound = False
       self.buff = ""
       self.level = 0

   def computeRecord (self, tag, attrs):
        mystr = "<" + tag + " "
        for att, val in attrs:
            mystr += att+"='"+val+ "' "
        mystr += ">"
        return mystr

   def handle_starttag (self, tag, attrs):
       if tag == "div" and ("class", "good") in attrs:
           self.divFound = True
       elif self.divFound:
          self.level += 1
          self.buff += self.computeRecord (tag, attrs)

   def handle_data (self, data):
       if self.divFound:
          self.buff += data


   def handle_endtag (self, tag):
      if self.divFound:
         self.buff += "</" + tag + ">"
         self.level -= 1
         if (self.level == 0):
            self.divFound = False
            print self.buff

使用
DOM
解析器来提取子树会更容易。您是否一直在使用
HTMLParser
?我尝试使用HTMLParser,因为项目的很大一部分已经完成了,我在解析子树时发现了这个问题。最后,我开始在缓冲区中记录html树,以便在
handle\u endtag()
结束感兴趣的块时使用它。这不是我想的解决办法,但我不再被困住了。谢谢你的建议,那么,你已经解决了吗?是的,我将用解决方案回答,但我等了几个小时,看看是否有比缓冲html更好的解决方案。我问你是因为我在考虑用
BeautifulSoup
提取子树,然后调用你的特定解析器。如果您一直使用
HTMLParser
,我的想法是记录每个节点,直到关闭
,但我看到您已经在使用它了。
<ul>
     <li>test1</li>
     <li>test2</li>
</ul>
soup = BeaufitulSoup (html)
div = soup("div", {"class" : "good"})
children = div[0].findChildren ()
print children[0]   #### desired output