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、何も返されません。印刷出力でタグが適切に閉じられていない理由はprintendtagおよび のタグの内容を および にhandle_endtagしなかったためhandle_dataです。

ネストされた div を処理しようとしている場合は、Alex answer here が役立つかもしれません。 Python HTMLParser ライブラリを使用して、特定の div タグからデータを抽出するにはどうすればよいですか? .

于 2013-11-13T02:13:59.213 に答える