从HTMLpars中获取HTML子树

2024-10-01 15:45:17 发布

您现在位置:Python中文网/ 问答频道 /正文

实际上,我在使用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提供以下内容:

^{pr2}$

但是在python文档中HTMLParser.handle_数据公司名称:

This method is called to process arbitrary data (e.g. text nodes and the content of <script>...</script> and <style>...</style>).

在mygenericParser中,handle_data中得到的数据是空的,因为我的<div class='good'>不是文本节点。在

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

提前谢谢


Tags: and数据selfdivfalsedata节点init
1条回答
网友
1楼 · 发布于 2024-10-01 15:45:17

我已经通过缓冲在有趣的HTML节点中遇到的所有数据来解决这个问题。在

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

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

输出符合要求:

^{pr2}$

正如Birei在评论中所说,我可以更容易地用beauthoulsoup提取子树

soup = BeaufitulSoup (html)
div = soup("div", {"class" : "good"})
children = div[0].findChildren ()
print children[0]   #### desired output

相关问题 更多 >

    热门问题