Python HTML 속성을 정리해주는 Bleach 라이브러리 알아보기

오늘은 Python으로 지정한 HTML 속성만 남기고 정리해주는 라이브러리인 Bleach를 적용해보려 합니다.

Bleach 설치

우선 virtualenv로 파이썬 환경을 분리해줍니다.

pip3 install virtualenv
virtualenv -mvenv env

env라는 이름의 가상 환경을 생성합니다.

source env/bin/activate

가상환경을 폴더에서 활성화합니다.

pip3 install --upgrade pip

pip의 업그레이드가 존재하는지 확인하고 진행합니다.

pip install bleach

pip로 Bleach를 설치합니다.

Sanitizing text

import bleach

bleach를 가져옵니다.

tag1 = bleach.clean('<b><i>example</i></b>', tags=['b'])
print(tag1)

특정 태그만 남기고 나머지는 태그가 실행되지 않도록 정리합니다.

tag2 = bleach.clean('<p class="foo" style="color: red; font-weight: bold;">example</p>',
                    tags=['p'],
                    attributes=['style'],
                    styles=['color'])
print(tag2)

특정 태그, 속성, 스타일을 남기고 나머지는 태그가 실행되지 않도록 정리합니다.

attrs = {'a': ['href', 'rel'],'img': ['alt']}

tag3 = bleach.clean('<img alt="an example" width=500>', tags=['img'], attributes=attrs)
print(tag3)

속성들을 딕셔너리로 묶어서 남기고 태그가 실행되지 않도록 정리합니다.

def allow_h(_, name, __):
    return name[0] == 'h'


tag4 = bleach.clean('<a href="http://example.com" title="link">example</a>', tags=['a'], attributes=allow_h)
print(tag4)

h로 시작하는 속성의 이름을 남기고 태그가 실행되지 않도록 정리합니다.

tag5 = bleach.clean('<a href="smb://more_text">example</a>',protocols=['http', 'https', 'smb'])
print(tag5)

특정 프로토콜만 남기고 태그가 실행되지 않도록 정리합니다.

tag6 = bleach.clean('<span>example</span>', strip=True)
print(tag6)

정리할 태그를 삭제할 결정을 할 수 있습니다.

html = '<!-- commented -->example'

tag7 = bleach.clean(html)
print(tag7)

주석을 지울 수 있습니다.

Linkifying text

import bleach
from bleach.linkifier import Linker

bleach를 가져옵니다.

link1 = bleach.linkify('http://example.com example')
print(link1)

기본적으로 example.com에 대한 a 태그가 생성됩니다.

def set_title(attrs, _):
    attrs[(None, 'title')] = 'example title'
    return attrs


linker = Linker(callbacks=[set_title])
link2 = linker.linkify('http://example.com example')
print(link2)

함수를 이용하여 a 태그의 타이틀 속성을 추가할 수 있습니다.

def allowed_attrs(attrs, _):
    allowed = [
        (None, 'href'),
        (None, 'style'),
        '_text',
    ]
    return dict((k, v) for k, v in attrs.items() if k in allowed)


linker = Linker(callbacks=[allowed_attrs])
link3 = linker.linkify('<a style="font-weight: super bold;" href="http://example.com">example</a>')
print(link3)

함수를 이용하여 특정 속성만 허용할 수 있습니다.

def shorten_url(attrs, _):
    text = attrs['_text']
    if len(text) > 20:
        attrs['_text'] = text[0:15] + '...'
        return attrs


linker = Linker(callbacks=[shorten_url])
link4 = linker.linkify('http://example.com/longlongurl')
print(link4)

함수를 이용하여 길이가 긴 url는 보여지는 문자열을 축약시킬 수 있습니다.

def remove_http(attrs, _):
    if attrs[(None, 'href')].startswith('http:'):
        return None


linker = Linker(callbacks=[remove_http])
link5 = linker.linkify('<a href="http://example.com">example</a>')
print(link5)

함수를 이용하여 href 속성에 http로 시작하는 내용이 있으면 해당 속성을 제거할 수 있습니다.

Written on May 22, 2019