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

问题描述:

我想从使用python HTMLParser库的HTML页面中获取一个值。我想弄个这个数值就是这个HTML元素中:如何使用python HTMLParser库从特定的div标签中提取数据?

... 
<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

+1

如果你做了很多HTML解析,尝试[美丽的汤(http://www.crummy.com/software/BeautifulSoup/)。 – zvone 2010-07-18 15:58:41

+3

该库是否包含在python std库中?我遇到它,但选择坚持HTMLParser。 – Martin 2010-07-18 16:33:46

+0

@zvone为什么BeautifulSoup更适合html解析?它仍然是推荐的模块?谢谢。 – 2016-03-28 20:11:09

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__从参数设置传递给它 - 我避免了上述代码中的低级泛化步骤,以避免模糊核心点(记录嵌套标记的计数并在记录状态处于活动状态时将数据累积到列表中)。在3号线

HTMLParser.HTMLParser.__init__(self)

+1

感谢亚历克斯,该代码完美工作(除了这条线“如果标记== div和self.recording:” - div应该是一个字符串)。实际上,正如你所描述的那样,我所说的返回值的类是类中的一个函数,用于返回所需的值。或者我可以轻松访问'数据'变量。我在那里的字典只是我的一些残余测试可能的解决方案:)谢谢你的帮助! – Martin 2010-07-18 15:38:39

+1

对于嵌套'div'的计数+1,对于第一次使用html解析的人来说并不那么明显。 – 2010-07-18 15:49:19

+0

@Martin,不用客气,+1可以发现我的注意力 - 我现在要编辑修改(引用'div'并删除该词典和评论),以便将来读者更有用。 – 2010-07-18 16:22:11

小修正它应该是

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

实际上你可以这样做,因为你指定了'from HTMLParser import HTMLParser',它允许你直接调用HTMLParser。不幸的是,他们都有相同的名字,但他们是两个不同的实体。你也可以像'从HTMLParser import HTMLParser as parser'那样做,然后使用'class MyHTMLParser(parser)' – 2011-01-24 23:22:25

您试过BeautifulSoup

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

这给你输出20

这完美的作品:

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