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

Mar*_*tin 37 html python parsing html-parsing

我试图使用python HTMLParser库从HTML页面中获取值.我想要掌握的值是在这个html元素中:

...
<div id="remository">20</div>
...
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的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()
Run Code Online (Sandbox Code Playgroud)

有人能指出我正确的方向吗?我希望类功能获得值20.

Ale*_*lli 55

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)
Run Code Online (Sandbox Code Playgroud)

self.recording计算div从"触发"标记开始的嵌套标记的数量.当我们位于以触发标记为根的子树中时,我们会累积数据self.data.

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

这个类可以很容易地取得多一点的一般使用,以代替在代码中看到上面的常量文字串,'div','id',和'remository',实例属性self.tag,self.attnameself.attvalue通过设置__init__从传递给它的参数-我避免了廉价的推广步骤在上面的代码中,以避免模糊核心点(跟踪嵌套标签的计数,并在记录状态处于活动状态时将数据累积到列表中).


小智 25

你试过BeautifulSoup吗?

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

这给你20输出.


psh*_*ddy 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()
Run Code Online (Sandbox Code Playgroud)

`

  • 实际上你可以这样做,因为你指定了`来自HTMLParser导入HTMLParser`,它允许你直接调用HTMLParser.不幸的是,它们都有相同的名称,但它们是两个不同的实体.您还可以执行类似`从HTMLParser导入HTMLParser作为解析器`,然后只使用`类MyHTMLParser(解析器)` (3认同)