2016-04-08 1 views
2

Mon usecase: Get pages HTML par jsoup et renvoie une w3c-DOM pour un traitement ultérieur par des transformations XML-:jsoup à w3c-document: INVALID_CHARACTER_ERR

... 
org.jsoup.nodes.Document document = connection.get(); 
org.w3c.dom.Document dom = new W3CDom().fromJsoup(document); 
... 

fonctionne bien pour la plupart des documents, mais pour certains, il jette INVALID_CHARACTER_ERR sans indiquer où.

Il semble extrêmement difficile de trouver l'erreur. J'ai changé le code pour d'abord importer l'URL à une chaîne et ensuite rechercher les mauvais caractères par regexp. Mais cela n'aide pas pour les mauvais attributs (par exemple sans valeur) etc.

Ma solution actuelle est de minimiser le risque en supprimant les éléments par tag dans le document jsoup (head, img, script ...).

Existe-t-il une solution plus élégante?

+0

Ne pas oublier de marquer votre réponse choisie comme acceptée pour fermer cette question. – Stephan

Répondre

1

Essayez de régler les outputSettings à 'XML' pour votre document:

document 
    .outputSettings() 
    .syntax(OutputSettings.Syntax.xml); 

document 
    .outputSettings() 
    .charset("UTF-8"); 

Cela devrait veiller à ce que le XML résultant est valide.

+0

Merci. Malheureusement, cela ne peut pas nettoyer le format html mal formaté contre lequel le navigateur est assez tolérant. par exemple: . Probablement provient d'une mauvaise configuration/utilisation de cms. hors de mon contrôle. –

+0

@ Jürg M hmm, c'est un très mauvais formatage. Jetez un oeil à 'Cleaner' de Jsoup (http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer) peut-être qu'il peut aider - au moins dans la suppression des éléments. Une autre option serait d'ajouter quelque chose comme 'HtmlCleaner' (http://htmlcleaner.sourceforge.net/) à votre pipeline de traitement. Il devrait être capable de produire du XML bien formaté. – nyname00

+0

Merci beaucoup; ceci a résolu le problème: Whitelist whiteList = Whitelist.relaxed(); Cleaner cleaner = nouveau Cleaner (whiteList); jsoupDom = cleaner.clean (jsoupDom); "détendu" en acte signifie développeur détendu ... –

1

solution trouvée par OP en réponse à nyname00:

Merci beaucoup; cette résolu le problème:

Whitelist whiteList = Whitelist.relaxed(); 
Cleaner cleaner = new Cleaner(whiteList); 
jsoupDom = cleaner.clean(jsoupDom); 

« détendue » dans signifie action développeur détendue ...