1

我正在使用 HTMLParser 从简单的 html 文本中提取图像 url,如下所示:

html = <p><span style="font-size: 17px;"><span style="color: #993300;"><img style="margin-right: 15px; vertical-align: top;" src="images/announcements.png" alt="announcements" /><cite>some message I would like to preserve with its formatting</cite></span></span></p>

现在我还需要一个没有 img 标签的上述 html 版本,但是在正确的位置关闭标签有困难。这是我尝试过的:

class MyHtmlParser(HTMLParser):
    '''
    Parse simple url to extract data and image url.
    This is expecting a simple url containing only one data block and one iimage url.
    '''
    def __init__(self):
        HTMLParser.__init__(self)
        self.noImgHtml = ''

    def handle_starttag(self, tag, attrs):
        if tag == 'img':
            for a in attrs:
                if a[0] == 'src':
                    self.imageUrl = a[1]
        else:
            print '<%s>' % tag
            self.noImgHtml += '<%s>' % tag
            for a in attrs:
                print '%s=%s' % a
                self.noImgHtml += '%s=%s' % a

    def handle_endtag(self, tag):
        self.noImgHtml += '</%s>' % tag

    def handle_data(self, data):
        self.noImgHtml += data

MyHtmlParser().feed(html) 的输出是这样的:

<b>LATEST NEWS:</b><p><span>style=font-size: 17px;<span>style=color: #993300;</img><cite>The image uploader works again, so make sure to use some screenshots in your uploads/tutorials to make your submission look extra nice</cite></span></span></p>

正如您所看到的(正如我的代码流所预期的那样),标签并没有像在原始 html 中那样关闭(例如 span>)。

这可以用 HTMLParser 轻松完成,还是我应该求助于 RE 来提取图像标签(这看起来不太优雅)?

我不能使用外部模块来执行此操作,因此需要使用 HTMLParser 提供的功能。

提前谢谢,坦率

4

2 回答 2

0

HTMLParser.get_starttag_text() 似乎是重建原始 html 的门票。这似乎有效:

class MyHtmlParser(HTMLParser):
    '''
    Parse simple url to extract data and image url.
    This is expecting a simple url containing only one data block and one iimage url.
    '''
    def __init__(self):
        HTMLParser.__init__(self)
        self.noImgHtml = ''

    def handle_starttag(self, tag, attrs):
        if tag == 'img':
            for a in attrs:
                if a[0] == 'src':
                    self.imageUrl = a[1]
        else:
            self.noImgHtml += self.get_starttag_text()


    def handle_endtag(self, tag):
        if tag != 'img':
            self.noImgHtml += '</%s>' % tag

    def handle_data(self, data):
        self.noImgHtml += data
        self.text = data
于 2013-11-13T03:16:32.740 回答
0

实际上,您的代码正在运行,您可以使用

parser = MyHtmlParser()
parser.feed(html)
parser.noImgHtml

真的是你想要的。我试过了,输出是

<p><span>style=font-size: 17px;<span>style=color: #993300;</img><cite>some message I would like to preserve with its formatting</cite></span></span></p>

除了您需要将handle_endtag功能更改为

def handle_endtag(self, tag):
    if tag != 'img'
        self.noImgHtml += '</%s>' % tag

排除img.

实际上MyHtmlParser().feed(html)只是print结果,它什么也不返回。打印输出中标签未正确关闭的原因是您没有and中printendtag标签内容。handle_endtaghandle_data

如果您正在尝试处理嵌套 div,Alex 在这里回答可能会有所帮助。 如何使用 python HTMLParser 库从特定的 div 标签中提取数据? .

于 2013-11-13T02:13:59.213 回答