Python 清理HTML標籤類似PHP的strip_tags函式功能(二)
阿新 • • 發佈:2019-02-05
沒有發現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)