파이썬에서 HTML을 탈출하는 가장 쉬운 방법은 무엇입니까?
cgi.escape는 하나의 가능한 선택처럼 보입니다. 잘 작동합니까? 더 나은 것으로 여겨지는 것이 있습니까?
cgi.escape괜찮습니다. 탈출 :
<에<>에>&에&
모든 HTML에 충분합니다.
편집 : ASCII가 아닌 문자가있는 경우 Craig 와 같이 다른 인코딩을 사용하는 다른 인코딩 된 문서에 포함시키기 위해 탈출하려고 합니다.
data.encode('ascii', 'xmlcharrefreplace')
인코딩 된 인코딩을 사용하여 먼저 디코딩 data하는 것을 잊지 마십시오 unicode.
그러나 내 경험상 unicode처음부터 항상 작업하면 그러한 종류의 인코딩이 쓸모가 없습니다 . 문서 헤더에 지정된 인코딩으로 끝까지 인코딩하십시오 ( utf-8최대 호환성을 위해).
예:
>>> cgi.escape(u'<a>bá</a>').encode('ascii', 'xmlcharrefreplace')
'<a>bá</a>
또한 주목할 가치가 있습니다 (Greg 덕분에)는 추가 quote매개 변수 cgi.escape가 필요합니다. 그것은에 설정으로 True, cgi.escape도 (큰 따옴표 문자를 탈출 "당신은 XML / HTML 속성에 결과 값을 사용할 수 있도록).
편집 : 이는 cgi가 찬성 파이썬 3.2에서 사용되지 참고 것을 html.escape제외하고 동일한 작업을 수행, quoteTrue로 기본 설정됩니다.
Python 3.2에는 htmlHTML 마크 업에서 예약 문자를 이스케이프하는 데 사용되는 새로운 모듈이 도입되었습니다.
그것은 하나의 기능을 가지고 있습니다 escape():
>>> import html
>>> html.escape('x > 2 && x < 7')
'x > 2 && x < 7'
URL에서 HTML을 이스케이프하려는 경우 :
이것은 아마도 OP가 원하는 것이 아닐 것입니다 (질문은 이스케이프가 사용될 컨텍스트를 명확하게 나타내지 않습니다). 그러나 Python의 기본 라이브러리 urllib 에는 URL에 안전하게 포함되어야하는 HTML 엔티티를 이스케이프하는 방법이 있습니다.
다음은 예입니다.
#!/usr/bin/python
from urllib import quote
x = '+<>^&'
print quote(x) # prints '%2B%3C%3E%5E%26'
우수한 마크 업 안전 패키지도 있습니다.
>>> from markupsafe import Markup, escape
>>> escape("<script>alert(document.cookie);</script>")
Markup(u'<script>alert(document.cookie);</script>')
markupsafe패키지는 잘 설계되고, 아마도 다양하고 파이썬 방법이 가장은, IMHO, 탈출 때문에 대한 이동 :
- 리턴 (
Markup)은 유니 코드에서 파생 된 클래스입니다 (예 :isinstance(escape('str'), unicode) == True - 유니 코드 입력을 올바르게 처리합니다.
- 파이썬 (2.6, 2.7, 3.3 및 pypy)에서 작동합니다.
- 객체의 사용자 정의 메소드 (예 :
__html__속성 이있는 객체 ) 및 템플릿 오버로드 (__html_format__)를 고려합니다.
cgi.escape HTML 태그 및 문자 엔터티를 이스케이프하는 제한적인 의미에서 HTML을 이스케이프 처리하는 것이 좋습니다.
그러나 인코딩 문제도 고려해야 할 수도 있습니다. 인용하려는 HTML에 특정 인코딩에서 ASCII가 아닌 문자가있는 경우 인용 할 때 해당 문자를 현명하게 표현해야합니다. 아마도 당신은 그것들을 엔티티로 변환 할 수 있습니다. 그렇지 않으면 ASCII가 아닌 문자가 손상되지 않도록 "소스"HTML과 포함 된 페이지간에 올바른 인코딩 변환이 수행되어야합니다.
순수한 파이썬 라이브러리는 텍스트를 html 텍스트로 안전하게 이스케이프하지 않습니다.
text.replace('&', '&').replace('>', '>').replace('<', '<'
).encode('ascii', 'xmlcharrefreplace')
cgi.escape 펼친
이 버전은 향상됩니다 cgi.escape. 또한 공백과 줄 바꿈을 유지합니다. unicode문자열을 반환 합니다.
def escape_html(text):
"""escape strings for display in HTML"""
return cgi.escape(text, quote=True).\
replace(u'\n', u'<br />').\
replace(u'\t', u' ').\
replace(u' ', u' ')
예를 들어
>>> escape_html('<foo>\nfoo\t"bar"')
u'<foo><br />foo "bar"'
Not the easiest way, but still straightforward. The main difference from cgi.escape module - it still will work properly if you already have & in your text. As you see from comments to it:
cgi.escape version
def escape(s, quote=None):
'''Replace special characters "&", "<" and ">" to HTML-safe sequences.
If the optional flag quote is true, the quotation mark character (")
is also translated.'''
s = s.replace("&", "&") # Must be done first!
s = s.replace("<", "<")
s = s.replace(">", ">")
if quote:
s = s.replace('"', """)
return s
regex version
QUOTE_PATTERN = r"""([&<>"'])(?!(amp|lt|gt|quot|#39);)"""
def escape(word):
"""
Replaces special characters <>&"' to HTML-safe sequences.
With attention to already escaped characters.
"""
replace_with = {
'<': '>',
'>': '<',
'&': '&',
'"': '"', # should be escaped in attributes
"'": ''' # should be escaped in attributes
}
quote_pattern = re.compile(QUOTE_PATTERN)
return re.sub(quote_pattern, lambda x: replace_with[x.group(0)], word)
Via BeautifulSoup4:
>>> bs4.dammit import EntitySubstitution
>>> esub = EntitySubstitution()
>>> esub.substitute_html("r&d")
'r&d'
참고URL : https://stackoverflow.com/questions/1061697/whats-the-easiest-way-to-escape-html-in-python
'Programming' 카테고리의 다른 글
| MySQL은 외래 키 제약 조건에서 필요한 인덱스를 삭제할 수 없습니다 (0) | 2020.06.29 |
|---|---|
| 웹 사이트에서 Google의 Roboto 글꼴을 사용하려면 어떻게해야하나요? (0) | 2020.06.29 |
| PHP에서 이것이 의미하는 바-> 또는 => [duplicate] (0) | 2020.06.29 |
| 데이터베이스에 태그를 저장하는 가장 효율적인 방법은 무엇입니까? (0) | 2020.06.29 |
| data.frame 열 형식을 문자에서 요소로 변환 (0) | 2020.06.29 |