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