2015-12-19 38 views
5

Sto utilizzando Jsoup per rimuovere tutte le immagini da una pagina HTML. Sto ricevendo la pagina attraverso una risposta HTTP, che contiene anche il set di caratteri del contenuto.Jsoup esegue il escape dei caratteri speciali

Il problema è che Jsoup recupera alcuni caratteri speciali.

Ad esempio, per l'ingresso:

<html><head></head><body><p>isn&rsquo;t</p></body></html> 

Dopo aver eseguito

String check = "<html><head></head><body><p>isn&rsquo;t</p></body></html>"; 
Document doc = Jsoup.parse(check); 
System.out.println(doc.outerHtml()); 

ottengo:

<html><head></head><body><p>isn’t</p></body></html><p></p> 

voglio evitare di modificare il codice HTML in qualsiasi altro modo, tranne per rimuovere le immagini.

Utilizzando il comando:

doc.outputSettings().prettyPrint(false).charset("ASCII").escapeMode(EscapeMode.extended); 

io capisco l'output corretto, ma sono sicuro che ci sono casi in cui che charset non sarà buono. Voglio solo usare il set di caratteri specificato nell'intestazione HTTP e temo che questo cambierà il mio documento in modi che non posso prevedere. Esiste un altro metodo più pulito per rimuovere le immagini senza modificare inavvertitamente qualcos'altro?

Grazie!

risposta

3

Ecco una soluzione alternativa che non riguarda alcun set di caratteri tranne quello specificato nell'intestazione HTTP.

String check = "<html><head></head><body><p>isn&rsquo;t</p></body></html>".replaceAll("&([^;]+?);", "**$1;"); 

Document doc = Jsoup.parse(check); 

doc.outputSettings().prettyPrint(false).escapeMode(EscapeMode.extended); 

System.out.println(doc.outerHtml().replaceAll("\\*\\*([^;]+?);", "&$1;")); 

USCITA

<html><head></head><body><p>isn&rsquo;t</p></body></html> 

DISCUSSIONE

Vorrei che ci fosse una soluzione in API Jsoup - @dlv

L'utilizzo di Jsoup'API richiede la scrittura di un NodeVisitor personalizzato. Ciò porterebbe a (ri) inventare un codice esistente all'interno di Jsoup. Il Nodevisitor personalizzato genererebbe un codice di escape HTML invece di un carattere unicode.

Un'altra opzione comporterebbe la scrittura di un codificatore di caratteri personalizzato. Il codificatore di caratteri UTF-8 predefinito può codificare &rsquo;. Questo è il motivo per cui Jsoup non conserva la sequenza di escape originale nel codice HTML finale.

Una delle due opzioni sopra indicate rappresenta un grande sforzo di codifica. In definitiva, è possibile aggiungere un miglioramento a Jsoup per consentirci di scegliere come generare i caratteri nel codice HTML finale: escape esadecimale (&#AB;), escape decimale (&#151;), sequenza di escape originale (&rsquo;) o scrivere il carattere codificato (che è il caso nel tuo post).

+0

Grazie, lo userò per ora anche se mi piacerebbe che ci fosse una soluzione nell'API di Jsoup. – dlv

+0

@dlv Si prega di consultare il mio aggiornamento. – Stephan

+0

Grazie! Questo è davvero informativo. – dlv