如何使用python HTMLParser库从特定div标签中提取数据?

时间:2010-07-18 15:06:05

标签: python html parsing html-parsing

我正在尝试使用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 个答案:

答案 0 :(得分:51)

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中累积数据。

解析结束时的数据保留在self.data中(字符串列表,如果没有满足触发标记,则可能为空)。您从类外部的代码可以直接从解析结束时的实例访问列表,或者您可以为此目的添加适当的访问器方法,具体取决于您的目标。

通过使用代替上面代码中的常量文字字符串'div''id''remository',实例属性,可以轻松地使类变得更加通用self.tagself.attnameself.attvalue,由传递给它的参数设置__init__ - 我在上面的代码中避免了那个廉价的泛化步骤,以避免模糊核心点(保持跟踪嵌套标签的数量,并在记录状态激活时将数据累积到列表中。)

答案 1 :(得分:23)

你试过BeautifulSoup吗?

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

这会在输出时给你20

答案 2 :(得分:5)

第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()

`

答案 3 :(得分:0)

这非常有效:

router <---> host machine running VirtualBox
  ^
  |
  +-----> guest machine running Debian