我正在尝试使用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。
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.recording``div
self.data
解析末尾的数据保留在其中self.data(字符串列表,如果未满足触发标签,则可能为空)。您可以从类外部的代码在解析结束时直接从实例访问列表,也可以为此目的添加适当的访问器方法,具体取决于目标是什么。
这个类可以很容易地取得多一点的一般使用,以代替在代码中看到的常量文字字符串上面,'div','id',和'remository',实例的属性self.tag,self.attname并且self.attvalue,通过设置__init__从传递给它的参数- 我避免了廉价的推广步骤避免混淆核心点(跟踪嵌套标签的数量并在记录状态为活动状态时将数据累积到列表中)。
'div'
'id'
'remository'
self.tag
self.attname
self.attvalue
__init__