Прервите HTMLParser, обрабатывающий в Python

При использовании HTMLParser класс в Python, это возможный прервать обработку в a handle_* функция? Рано в обработке, я получаю все данные, в которых я нуждаюсь, таким образом, на отходы походит продолжать обрабатывать. Существует пример ниже извлечения meta описания для документа.

from HTMLParser import HTMLParser

class MyParser(HTMLParser):

    def handle_start(self, tag, attrs):
        in_meta = False
        if tag == 'meta':
          for attr in attrs:
              if attr[0].lower() == 'name' and attr[1].lower() == 'description':
                  in_meta = True
              if attr[0].lower() == 'content':
                  print(attr[1])
                  # Would like to tell the parser to stop now,
                  # since I have all the data that I need
5
задан Michael Mior 4 January 2010 в 02:57
поделиться

2 ответа

Вы можете вызвать исключение и заключить вызов .feed () в блок попытки.

Вы также можете вызвать self.reset () , когда решите, что все готово (на самом деле я не пробовал, но согласно документации «Сбросить экземпляр. все необработанные данные. », - это именно то, что вам нужно).

10
ответ дан 13 December 2019 в 19:28
поделиться

Если вы используете метод pyparsing's scanString, у вас есть больше контроля над тем, как далеко вы на самом деле проходите через входную строку. В вашем примере, мы создаем выражение, которое соответствует тегу , и добавляем действие по разбору, которое обеспечивает соответствие тега только с name="description". Этот код предполагает, что вы прочитали HTML страницы в переменную htmlsrc:

from pyparsing import makeHTMLTags, withAttribute

# makeHTMLTags creates both open and closing tags, only care about the open tag
metaTag = makeHTMLTags("meta")[0]
metaTag.setParseAction(withAttribute(name="description"))

try:
    # scanString is a generator that returns each match as it is found
    # in the input
    tokens,startloc,endloc = metaTag.scanString(htmlsrc).next()

    # attributes can be accessed like object attributes if they are 
    # valid Python names
    print tokens.content

    # if the attribute name clashes with a Python keyword, or is 
    # otherwise unsuitable as an identifier, use dict-like access instead
    print tokens["content"]

except StopIteration:
    print "no matching meta tag found"
1
ответ дан 13 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

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