Как я могу пользоваться библиотекой HTMLParser Python для извлечения данных из определенного тега Div?

Я пытаюсь вытащить значение из страницы 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.

37
задан Martin 19 July 2010 в 11:15
поделиться

1 ответ

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 __ ] из переданных ему аргументов - я избежал этого дешевого шага обобщения в приведенном выше коде, чтобы не заслонять основные моменты (отслеживать количество вложенных тегов и накапливать данные в список, когда состояние записи активно).

55
ответ дан 27 November 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: