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

新手上路,请多包涵

我正在尝试使用 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://example.com/somepage.html")
html = f.read()
p.feed(html)
p.close()

我希望类功能获得值 20。

原文由 Martin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 461
2 个回答
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' 196 代替上面代码中看到的常量字符串,可以轻松地使该类更通用一些, instance attributes self.tag , self.attname and self.attvalue , set by __init__ from arguments passed to it – I avoided that cheap generalization step in上面的代码避免混淆核心点(跟踪嵌套标签的数量并在记录状态处于活动状态时将数据累积到列表中)。

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 2.5 许可协议

你试过 BeautifulSoup 吗?

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

这给你 20 输出。

原文由 modzello86 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题