Python HTMLParser - PullRequest
       0

Python HTMLParser

3 голосов
/ 26 августа 2011

Я анализирую HTML-документ с использованием HTMLParser и хочу напечатать содержимое между началом и концом тега p

Смотрите мой фрагмент кода

    def handle_starttag(self, tag, attrs):
        if tag == 'p':
            print "TODO: print the contents"

Ответы [ 3 ]

6 голосов
/ 26 августа 2011

Исходя из того, что написал @tauran, вы, вероятно, захотите сделать что-то вроде этого:

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def print_p_contents(self, html):
        self.tag_stack = []
        self.feed(html)

    def handle_starttag(self, tag, attrs):
        self.tag_stack.append(tag.lower())

    def handle_endtag(self, tag):
        self.tag_stack.pop()

    def handle_data(self, data):
        if self.tag_stack[-1] == 'p':
            print data

p = MyHTMLParser()
p.print_p_contents('<p>test</p>')

Теперь вы можете поместить все содержимое <p> в список и вернуть его в результате иличто-то еще в этом роде.

TIL: при работе с такими библиотеками нужно думать о стеках !

4 голосов
/ 26 августа 2011

Я расширил пример из документов :

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        print "Encountered the beginning of a %s tag" % tag

    def handle_endtag(self, tag):
        print "Encountered the end of a %s tag" % tag

    def handle_data(self, data):
        print "Encountered data %s" % data

p = MyHTMLParser()
p.feed('<p>test</p>')

-

Encountered the beginning of a p tag
Encountered data test
Encountered the end of a p tag
1 голос
/ 08 июля 2015

Это не сработало для моего кода, поэтому я определил tag_stack = [] снаружи как своего рода глобальную переменную.

from html.parser import HTMLParser
    tag_stack = []
    class MONanalyseur(HTMLParser):

    def handle_starttag(self, tag, attrs):
        tag_stack.append(tag.lower())
    def handle_endtag(self, tag):
        tag_stack.pop()
    def handle_data(self, data):
        if tag_stack[-1] == 'head':
            print(data)

parser=MONanalyseur()
parser.feed()    
...