При использовании 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
Вы можете вызвать исключение и заключить вызов .feed ()
в блок попытки.
Вы также можете вызвать self.reset ()
, когда решите, что все готово (на самом деле я не пробовал, но согласно документации «Сбросить экземпляр. все необработанные данные. », - это именно то, что вам нужно).
Если вы используете метод 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"