<질문>
cgi.escape는 하나의 가능한 선택 인 것 같습니다. 잘 작동합니까? 더 나은 것으로 간주되는 것이 있습니까?
<답변1>
cgi.escape
괜찮습니다. 이스케이프 :
<
...에<
>
...에>
&
...에&
모든 HTML에 충분합니다.
편집 : 비 ASCII 문자가있는 경우 다른 인코딩을 사용하는 다른 인코딩 된 문서에 포함하기 위해 이스케이프하려는 경우크레이그다음을 사용하십시오.
data.encode('ascii', 'xmlcharrefreplace')
디코딩하는 것을 잊지 마세요data
...에unicode
첫째, 인코딩 된 인코딩을 사용합니다.
그러나 내 경험상 이러한 종류의 인코딩은unicode
처음부터 항상. 끝 부분에서 문서 헤더에 지정된 인코딩으로 인코딩 (utf-8
최대 호환성을 위해).
예:
>>> cgi.escape(u'bá').encode('ascii', 'xmlcharrefreplace')
'<a>bá</a>
또한 주목할만한 가치가 있습니다 (Greg에게 감사드립니다).quote
매개 변수cgi.escape
걸립니다. 그것으로 설정True
,cgi.escape
또한 큰 따옴표 문자 ("
) XML / HTML 속성에서 결과 값을 사용할 수 있습니다.
편집 : cgi.escape는 Python 3.2에서 더 이상 사용되지 않습니다.html.escape
, 그 점을 제외하고는 동일합니다.quote
기본값은 True입니다.
<답변2>
Python 3.2에서 새로운html
HTML 마크 업에서 예약 된 문자를 이스케이프하는 데 사용되는 모듈이 도입되었습니다.
그것은 하나의 기능이 있습니다escape()
:
>>> import html
>>> html.escape('x > 2 && x < 7 single quote: \' double quote: "')
'x > 2 && x < 7 single quote: ' double quote: "'
<답변3>
URL에서 HTML을 이스케이프하려면 :
이것은 아마도 OP가 원했던 것이 아닐 것입니다 (질문은 이스케이프가 사용되는 컨텍스트를 명확하게 나타내지 않습니다), Python의 기본 라이브러리urllibURL에 안전하게 포함되어야하는 HTML 엔티티를 이스케이프하는 방법이 있습니다.
다음은 그 예입니다.
#!/usr/bin/python
from urllib import quote
x = '+<>^&'
print quote(x) # prints '%2B%3C%3E%5E%26'
<답변4>
또한 우수합니다markupsafe package.
>>> from markupsafe import Markup, escape
>>> escape("alert(document.cookie);") Markup(u'<script>alert(document.cookie);</script>')
그만큼markupsafe
패키지는 잘 설계되었으며, 아마도 IMHO를 탈출하는 가장 다재다능하고 파이썬적인 방법 일 것입니다.
- 반환 (
Markup
)는 유니 코드에서 파생 된 클래스입니다 (예 :isinstance(escape('str'), unicode) == True
- 유니 코드 입력을 올바르게 처리합니다.
- Python (2.6, 2.7, 3.3 및 pypy)에서 작동합니다.
- 개체의 사용자 지정 메서드 (예 :
__html__
속성) 및 템플릿 오버로드 (__html_format__
).
<답변5>
cgi.escape
HTML 태그 및 문자 엔터티를 이스케이프하는 제한된 의미에서 HTML을 이스케이프하는 것이 좋습니다.
그러나 인코딩 문제도 고려해야 할 수도 있습니다. 인용하려는 HTML에 특정 인코딩에 ASCII가 아닌 문자가있는 경우 인용 할 때 해당 문자를 현명하게 표현하도록주의해야합니다. 아마도 그것들을 엔티티로 변환 할 수있을 것입니다. 그렇지 않으면 비 ASCII 문자가 손상되지 않도록 "소스"HTML과 해당 HTML이 포함 된 페이지간에 올바른 인코딩 변환이 수행되는지 확인해야합니다.
<답변6>
라이브러리가없고 순수한 파이썬은 텍스트를 html 텍스트로 안전하게 이스케이프합니다.
text.replace('&', '&').replace('>', '>').replace('<', '<'
).replace('\'',''').replace('"','"').encode('ascii', 'xmlcharrefreplace')
<답변7>
이 버전은 향상cgi.escape
. 또한 공백과 줄 바꿈도 유지합니다. 반환unicode
끈.
def escape_html(text):
"""escape strings for display in HTML"""
return cgi.escape(text, quote=True).\
replace(u'\n', u'
').\
replace(u'\t', u' ').\
replace(u' ', u' ')
>>> escape_html('\nfoo\t"bar"')
u'<foo>
foo "bar"'
<답변8>
가장 쉬운 방법은 아니지만 여전히 간단합니다. 주요 차이점cgi.escape모듈-이미 가지고 있다면 여전히 제대로 작동합니다.&
당신의 텍스트에서. 댓글에서 알 수 있듯이 :
cgi.escape 버전
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
정규식 버전
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)
<답변9>
Python 2.7의 레거시 코드의 경우 다음을 통해 수행 할 수 있습니다.BeautifulSoup4:
>>> bs4.dammit import EntitySubstitution
>>> esub = EntitySubstitution()
>>> esub.substitute_html("r&d")
'r&d'
'개발 > Python' 카테고리의 다른 글
Python의 팩토리얼 함수 (0) | 2021.01.13 |
---|---|
[파이썬] ImportError: No Module Named bs4 (BeautifulSoup) (0) | 2021.01.13 |
파이썬에서 줄임표 슬라이싱 구문을 어떻게 사용합니까? (0) | 2021.01.12 |
Python에서 문자열을 Enum으로 변환 (0) | 2021.01.12 |