web-dev-qa-db-fra.com

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

J'essaie d'obtenir une valeur d'une page HTML à l'aide de la bibliothèque python HTMLParser. La valeur que je veux obtenir est dans cet élément html:

...
<div id="remository">20</div>
...

Voici 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 me diriger dans la bonne direction? Je veux que la fonctionnalité de classe obtienne la valeur 20.

30
Martin
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 tags div imbriqués en commençant par un "déclencheur". Lorsque nous sommes dans la sous-arborescence enracinée dans une balise déclenchante, nous accumulons les données dans self.data.

Les données à la fin de l'analyse sont laissées dans self.data (une liste de chaînes, éventuellement vides si aucune balise de déclenchement n'était remplie). Votre code provenant 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 des méthodes d'accesseur appropriées à cette fin, en fonction de votre objectif.

La classe pourrait être facilement 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', les attributs d'instance self.tag, self.attname et self.attvalue, définis par __init__ à partir des arguments qui lui ont été transmis - - J'ai évité cette étape de généralisation peu coûteuse dans le code ci-dessus pour éviter de masquer les points essentiels (garder trace du nombre de balises imbriquées et accumuler des données dans une liste lorsque l'état d'enregistrement est actif).

49
Alex Martelli

Avez-vous essayé BeautifulSoup

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

Cela vous donne 20 en sortie.

23
modzello86

Cela fonctionne parfaitement:

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