Comment puis-je utiliser la bibliothèque python HTMLParser pour extraire des données d'une balise div spécifique?

j'essaie d'obtenir une valeur à partir d'une page HTML en utilisant la bibliothèque python HTMLParser. La valeur que je veux obtenir est dans cet élément html:

...
<div id="remository">20</div>
...
<!-C'est ma classe HTMLParser jusqu'à présent:

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

Quelqu'un peut-il m'indiquer la bonne direction? Je veux la fonctionnalité de classe pour obtenir la valeur 20.

28
demandé sur Martin 2010-07-18 19:06:04

4 réponses

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 compte le nombre de imbriquée div tags à partir d'un "déclenchement". Lorsque nous sommes dans le sous-arbre enraciné dans une balise de déclenchement, nous accumulons les données dans self.data.

les données à La fin de l'analyse sont laissés dans self.data (une liste de chaînes, éventuellement vides si aucune balise de déclenchement n'a été respectée). Votre code venant de l'extérieur de la classe peut accéder à la liste directement à partir de l'instance à la fin de l'analyse, ou vous pouvez ajouter les méthodes d'accesseur appropriées pour le but, selon ce qui est exactement votre but.

la classe pourrait facilement être rendue un peu plus générale en utilisant, au lieu des chaînes littérales constantes vues dans le code ci-dessus, 'div','id' et 'remository', attributs d'instance self.tag,self.attname et self.attvalue, définie par __init__ à partir des arguments passés à lui -- j'ai évité que étape de généralisation bon marché dans le code ci-dessus pour éviter d'obscurcir les points de base (garder la trace d'un nombre d'étiquettes emboîtées et accumuler des données dans une liste quand l'état d'enregistrement est actif).

46
répondu Alex Martelli 2010-07-18 16:26:59