代码之家  ›  专栏  ›  技术社区  ›  Martin

如何使用python htmlparser库从特定的DIV标记中提取数据?

  •  30
  • Martin  · 技术社区  · 14 年前

    我尝试使用python htmlparser库从HTML页面中获取一个值。我要获取的值在此HTML元素中:

    ...
    <div id="remository">20</div>
    ...
    

    这是迄今为止我的HTMLParser类:

    class LinksParser(HTMLParser.HTMLParser):
      def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.seen = {}
    
      def handle_starttag(self, tag, attributes):
        if tag != 'div': return
        for name, value in attributes:
        if name == 'id' and value == 'remository':
          #print value
          return
    
      def handle_data(self, data):
        print data
    
    
    p = LinksParser()
    f = urllib.urlopen("http://domain.com/somepage.html")
    html = f.read()
    p.feed(html)
    p.close()
    

    有人能给我指个方向吗?我希望类功能获得值20。

    4 回复  |  直到 8 年前
        1
  •  49
  •   Alex Martelli    14 年前
    class LinksParser(HTMLParser.HTMLParser):
      def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.recording = 0
        self.data = []
    
      def handle_starttag(self, tag, attributes):
        if tag != 'div':
          return
        if self.recording:
          self.recording += 1
          return
        for name, value in attributes:
          if name == 'id' and value == 'remository':
            break
        else:
          return
        self.recording = 1
    
      def handle_endtag(self, tag):
        if tag == 'div' and self.recording:
          self.recording -= 1
    
      def handle_data(self, data):
        if self.recording:
          self.data.append(data)
    

    self.recording 统计嵌套的数目 div 从“触发”标签开始。当我们在以触发标记为根的子树中时,我们将数据累积到 self.data .

    分析结束时的数据保留在 自身数据 (字符串列表,如果未满足触发标记,则可能为空)。类外部的代码可以直接从解析结束时的实例访问列表,也可以为此目的添加适当的访问器方法,具体取决于您的目标是什么。

    类可以很容易地变得更通用一些,方法是使用,代替上面代码中看到的常量文本字符串, 'div' , 'id' 'remository' ,实例属性 self.tag , self.attname self.attvalue ,由 __init__ 从传递给它的参数来看——我避免了上面代码中的廉价泛化步骤,以避免隐藏核心点(跟踪嵌套标记的计数,并在记录状态为活动时将数据累积到列表中)。

        2
  •  23
  •   modzello86    12 年前

    你试过了吗? BeautifulSoup ?

    from bs4 import BeautifulSoup
    soup = BeautifulSoup('<div id="remository">20</div>')
    tag=soup.div
    print(tag.string)
    

    这给了你 20 关于输出。

        3
  •  5
  •   pshirishreddy    14 年前

    第3行的小修正

    HTMLParser.HTMLParser.__init__(self)

    应该是

    HTMLParser.__init__(self)

    不过,以下几点对我很有用

    import urllib2 
    
    from HTMLParser import HTMLParser  
    
    class MyHTMLParser(HTMLParser):
    
      def __init__(self):
        HTMLParser.__init__(self)
        self.recording = 0 
        self.data = []
      def handle_starttag(self, tag, attrs):
        if tag == 'required_tag':
          for name, value in attrs:
            if name == 'somename' and value == 'somevale':
              print name, value
              print "Encountered the beginning of a %s tag" % tag 
              self.recording = 1 
    
    
      def handle_endtag(self, tag):
        if tag == 'required_tag':
          self.recording -=1 
          print "Encountered the end of a %s tag" % tag 
    
      def handle_data(self, data):
        if self.recording:
          self.data.append(data)
    
     p = MyHTMLParser()
     f = urllib2.urlopen('http://www.someurl.com')
     html = f.read()
     p.feed(html)
     print p.data
     p.close()
    

    `

        4
  •  0
  •   Undo ptrk    8 年前

    这非常有效:

    print (soup.find('the tag').text)