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.
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).
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.
Cela fonctionne parfaitement:
print (soup.find('the tag').text)