cgi.escape sembra una scelta possibile. Funziona bene? C'è qualcosa che è considerato migliore?Qual è il modo più semplice per sfuggire HTML in Python?
risposta
cgi.escape
va bene. Sfugge:
<
al<
>
->
&
al&
Questo è sufficiente per tutti HTML.
EDIT: Se si dispone di caratteri non-ASCII anche voi volete sfuggire, per l'inclusione in un altro documento codificato che utilizza una codifica diversa, come Craig dice, basta usare:
data.encode('ascii', 'xmlcharrefreplace')
Non dimentica di decodificare data
a unicode
prima, usando qualsiasi codifica che è stata codificata.
Tuttavia nella mia esperienza quel tipo di codifica è inutile se si lavora sempre con unicode
dall'inizio. Basta codificare alla fine della codifica specificata nell'intestazione del documento (utf-8
per la massima compatibilità).
Esempio:
>>> cgi.escape(u'<a>bá</a>').encode('ascii', 'xmlcharrefreplace')
'<a>bá</a>
Degno di nota (grazie Greg) è il più parametri quote
cgi.escape
prende. Impostandolo su True
, cgi.escape
sfugge anche caratteri con doppia citazione ("
) in modo da poter utilizzare il valore risultante in un attributo XML/HTML.
EDIT: Si noti che cgi.escape è stato deprecato in Python 3.2 in favore di html.escape
, che fa la stessa tranne che quote
default è true.
cgi.escape
dovrebbe essere utile per evitare l'HTML nel senso limitato di escape dei tag HTML e delle entità dei caratteri.
Ma potrebbe essere necessario prendere in considerazione anche i problemi di codifica: se l'HTML che si desidera citare ha caratteri non ASCII in una particolare codifica, allora si dovrebbe anche fare attenzione a rappresentarli sensibilmente quando si cita. Forse potresti convertirli in entità. Altrimenti dovresti assicurarti che le traduzioni corrette di codifica siano fatte tra l'HTML "sorgente" e la pagina in cui è incorporato, per evitare di corrompere i caratteri non ASCII.
In Python 3.2 è stato introdotto un nuovo modulo html
, che viene utilizzato per l'escape di caratteri riservati dal markup HTML.
Ha una funzione di escape()
:
>>> import html
>>> html.escape('x > 2 && x < 7')
'x > 2 && x < 7'
ATTENZIONE: non utilizzare questo per i valori degli attributi, ha vinto ' t fuga cose come (né cgi.escape). –
Che dire di 'quote = True'? – 2rs2ts
Se si desidera fuggire HTML in un URL:
Questo probabilmente non è quello che il PO ha voluto (la questione non indicare chiaramente in quale contesto si intende utilizzare l'escaping), ma la libreria nativa di Python urllib ha un metodo per sfuggire alle entità HTML che devono essere incluse in un URL in modo sicuro.
Quanto segue è un esempio:
#!/usr/bin/python
from urllib import quote
x = '+<>^&'
print quote(x) # prints '%2B%3C%3E%5E%26'
Questo è il tipo di escape errato; stiamo cercando [HTML escape] (http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references), al contrario di [codifica URL] (http://en.wikipedia.org/wiki/URL_Encoding). – Chaosphere2112
Tuttavia, era quello che stavo davvero cercando ;-) – Brad
cgi.escape
esteso
Questa versione migliora cgi.escape
. Conserva anche spazi bianchi e nuove righe. Restituisce una stringa 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' ')
ad esempio
>>> escape_html('<foo>\nfoo\t"bar"')
u'<foo><br />foo "bar"'
Via BeautifulSoup4:
>>> bs4.dammit import EntitySubstitution
>>> esub = EntitySubstitution()
>>> esub.substitute_html("r&d")
'r&d'
Non il modo più semplice, ma comunque semplice. La principale differenza dal modulo cgi.escape: funzionerà ancora correttamente se hai già &
nel testo. Come si può vedere dai commenti ad esso:
cgi.escape versione
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 versione
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)
C'è anche l'eccellente markupsafe package.
>>> from markupsafe import Markup, escape
>>> escape("<script>alert(document.cookie);</script>")
Markup(u'<script>alert(document.cookie);</script>')
Il pacchetto markupsafe
è ben progettato, e probabilmente il modo più versatile e Pythonic andare di fuggire, secondo me, perché:
- il ritorno (
Markup
) è una classe derivata da unicode (vale a direisinstance(escape('str'), unicode) == True
- Gestisce correttamente l'input Unicode
- funziona in Python (2.6, 2.7, 3.3, e PyPy)
- esso rispetta i metodi personalizzati di oggetti (ad es. oggetti con una proprietà
__html__
) e sovraccarichi modello (__html_format__
).
- 1. Qual è il modo migliore per sfuggire ai caratteri specifici di HTML in una stringa (PowerShell)?
- 2. Qual è il modo più semplice per scambiare il char in una stringa con Python?
- 3. Qual è il modo più semplice per mantenere oggetti java?
- 4. C#: qual è il modo più semplice per sottrarre tempo?
- 5. Il modo più semplice per rm -rf in Python
- 6. Qual è il modo migliore per sfuggire HTML sull'applicazione ExtJS in generale?
- 7. il modo più semplice per incorporare Perl in html
- 8. Qual è il modo più semplice per sottrarre un mese da una data in Python?
- 9. Qual è il modo più semplice per accedere a un microfono di un computer in Python?
- 10. Qual è il modo più semplice per creare un iterabile vuoto usando yield in Python?
- 11. Qual è il modo più semplice tra piattaforme per visualizzare finestre di dialogo grafiche in Python?
- 12. Qual è il modo più semplice per eseguire gli script Python in un server cloud?
- 13. Qual è il modo più semplice per creare un'estensione C opzionale per un pacchetto python?
- 14. Qual è il modo Pythonic per implementare un semplice FSM?
- 15. Il modo più semplice per risolvere equazioni matematiche in Python
- 16. Qual è il modo più semplice per combinare più raccolte in uno stream in Java?
- 17. Qual è il cloud più semplice per contenuto Web statico
- 18. Qual è il modo più semplice per inserire uno script Python nella barra delle applicazioni (Windows)
- 19. ANTLR Qual è il modo più semplice per realizzare la grammatica basata su indent python?
- 20. Qual è il modo più semplice per convertire la lista con str in list con int?
- 21. Qual è il modo più semplice per far funzionare matplotlib in OSX in un ambiente virtuale?
- 22. Qual è l'algoritmo più semplice per sfuggire a un singolo personaggio?
- 23. Qual è il modo più semplice per ottenere l'ora GMT in formato timestamp Unix?
- 24. Qual è il modo più semplice per leggere diversi ints da stdin se è ok fallire?
- 25. Qual è il modo più semplice in C# per convalidare se un'espressione regolare è ben formata?
- 26. Qual è il modo più semplice per rinominare il file che stai modificando in Vim?
- 27. In Chrome, qual è il modo più semplice per visualizzare il tipo mime di un documento?
- 28. Qual è il modo più semplice in Javascript per ottenere solo il segno di un numero?
- 29. Qual è il modo più semplice per stampare il testo sullo schermo in OpenGL?
- 30. Qual è il modo più semplice per utilizzare il comando HEAD di HTTP in PHP?
Il parametro booleano aggiuntivo a cgi.escape deve essere considerato anche per le citazioni di escape quando il testo viene utilizzato nei valori di attributo HTML. –
Solo per essere sicuri: se eseguo tutti i dati non fidati attraverso il 'cgi.funzione di fuga, è sufficiente per proteggere contro tutti gli attacs (noti) XSS? –
@Tomas Sedovic: dipende da dove verrà inserito il testo dopo aver eseguito cgi.escape in esso. Se inserito nel contesto HTML di root, allora sì, sei completamente al sicuro. – nosklo