Python HTMLParser

时间:2011-08-26 11:36:44

标签: python html html-parsing

我正在使用HTMLParser解析html文档,我想在p标签的开头和结尾之间打印内容

请参阅我的代码段

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

3 个答案:

答案 0 :(得分:6)

基于@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:在使用像这样的库时,你需要考虑堆栈

答案 1 :(得分:4)

我从docs

扩展了示例
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

答案 2 :(得分:1)

它似乎不适用于我的代码所以我将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() 定义为外部类似于一种全局变量。

SELECT * WHERE {
?Film <http://data.linkedmdb.org/resource/movie/country> <http://data.linkedmdb.org/resource/country/GB> .
?Film <http://data.linkedmdb.org/resource/movie/actor> ?actor.
}