Я пытаюсь вытащить значение из страницы HTML, пользующейся библиотекой HTMLParser Python. Значение, которым я хочу овладеть, в этом элементе 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://domain.com/somepage.html")
html = f.read()
p.feed(html)
p.close()
Кто-то может указать на меня в правильном направлении? Я хочу, чтобы функциональность класса получила значение 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
подсчитывает количество вложенных тегов div
, начиная с «запускающего». Когда мы находимся в поддереве, основанном на теге запуска, мы накапливаем данные в self.data
.
Данные в конце синтаксического анализа остаются в self.data
(список строк, возможно, пустой, если не был встречен тег запуска). Ваш код извне класса может получить доступ к списку непосредственно из экземпляра в конце синтаксического анализа, или вы можете добавить соответствующие методы доступа для этой цели, в зависимости от того, что именно является вашей целью.
Класс можно легко сделать немного более общим, используя вместо константных литеральных строк, показанных в приведенном выше коде, 'div'
, 'id'
и 'remository'
, атрибуты экземпляра self.tag
, self.attname
и self.attvalue
, устанавливаются __ init __
] из переданных ему аргументов - я избежал этого дешевого шага обобщения в приведенном выше коде, чтобы не заслонять основные моменты (отслеживать количество вложенных тегов и накапливать данные в список, когда состояние записи активно).