仅打印HTML“p”节点

时间:2015-11-10 00:18:52

标签: python html

我正在尝试使用HTMLParser打印HTML文档的“p”标记中包含的任何内容,而不是其他类型标记中的任何其他内容。

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if "p" in tag:
            print "Data in <p>:\n"
    def handle_data(self, data):
        print data

parser = MyHTMLParser()
parser.feed('<html><head><h1>The Lorem Ipsum</h1></head>'
            '<body><p>Lorem ipsum dolor sit amet.</p><b>'
            '<h2>Click Next for the next part.</h2><h3>'
            'Coming Soon!</h3><p>Thanks.</p></body></html>')

使用它也会显示标题,这是我不想要的。

但是,当我尝试更改某些内容时,它应该只显示“数据”部分的“p”,“p”标记中不会显示任何内容。

    def handle_data(self, tag, data):
        if "p" in tag:
            print data

我也很困惑,我是如何正确地构建我的代码才能使用它。

2 个答案:

答案 0 :(得分:0)

您需要跟踪<p>标记的时间:

class MyHTMLParser(HTMLParser):
    __in_p = None

    def handle_starttag(self, tag, attrs):
        if tag == 'p':
            self.__in_p = True
    def handle_endtag(self, tag):
        if tag == 'p':
            self.__in_p = False
    def handle_data(self, data):
        if self.__in_p:
            print("Encountered   some data:", data)

如果代码本身可以嵌套(<p>可以&{t},<div>可以),则此代码无法使用。您可以使用BeautifulSouppip install beautifulsoup4),lxml.htmllxml)来解析HTML。

答案 1 :(得分:0)

由于HTMLParser在单独的事件中显示数据,因此您需要跟踪状态,以便了解要打印的内容。此外,'p' in tag会抓住任何带有&#39; p&#39;在它,但不是一个大写的P。

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.last_tag = ''
    def handle_starttag(self, tag, attrs):
        self.last_tag = tag
    def handle_data(self, data):
        if self.last_tag in ('p', 'P'):
            print data

parser = MyHTMLParser()
parser.feed('<html><head><h1>The Lorem Ipsum</h1></head>'
            '<body><p>Lorem ipsum dolor sit amet.</p><b>'
            '<h2>Click Next for the next part.</h2><h3>'
            'Coming Soon!</h3><p>Thanks.</p></body></html>')