1. 程式人生 > >Python 清理HTML標籤類似PHP的strip_tags函式功能(二)

Python 清理HTML標籤類似PHP的strip_tags函式功能(二)

沒有發現Python 有現成的類似功能模組,所以昨天寫了個簡單的 strip_tags 但還有些問題,今天應用到採集上時進行了部分功能的完善,

1. 對自閉和標籤處理

2. 以及對標籤引數的過濾

from html.parser import HTMLParser


def strip_tags(html, allow_tags=None, allow_attrs=None):
    result = []
    start = []
    data = []
    # 特殊的自閉和標籤, 按 HTML5 的規則, 如 <br> <img> <wbr> 不再使用 /> 結尾
    special_end_tags = [
        'area', 'base', 'br', 'col', 'embed', 'hr',
        'img', 'input', 'keygen', 'link', 'meta', 'param',
        'source', 'track', 'wbr'
    ]

    def starttag(tag, attrs):
        if tag not in allow_tags:
            return
        start.append(tag)
        my_attrs = []
        if attrs:
            for attr in attrs:
                if allow_attrs and attr[0] not in allow_attrs:
                    continue
                my_attrs.append(attr[0] + '="' + attr[1] + '"')
            if my_attrs:
                my_attrs = ' ' + (' '.join(my_attrs))
            else:
                my_attrs = ''
        else:
            my_attrs = ''

        result.append('<' + tag + my_attrs + '>')

    def endtag(tag):
        if start and tag == start[len(start) - 1]:
            # 特殊自閉和標籤按照HTML5規則不加反斜槓直接尖括號結尾
            if tag not in special_end_tags:
                result.append('</' + tag + '>')

    parser = HTMLParser()
    parser.handle_data = result.append
    if allow_tags:
        parser.handle_starttag = starttag
        parser.handle_endtag = endtag
    parser.feed(html)
    parser.close()

    for i in range(0, len(result)):
        tmp = result[i].rstrip('\n')
        tmp = tmp.lstrip('\n')
        if tmp:
            data.append(tmp)

    return ''.join(data)