Проблемы с использованием расширенного режима escape для вывода jsoup

Мне нужно преобразовать файл HTML, удалив из файла определенные теги. Для этого у меня есть что-то вроде этого -

import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Entities;
import org.jsoup.nodes.Entities.EscapeMode;

import java.io.IOException;
import java.io.File;
import java.util.*;

public class TestJsoup {
    public static void main(String[] args) throws IOException {
        Validate.isTrue(args.length == 1, "usage: supply url to fetch");
        String url = args[0];

        Document doc = null;
        if(url.contains("http")) {
           doc = Jsoup.connect(url).get();
        } else {
           File f = new File(url);
           doc = Jsoup.parse(f, null);
        }

        /* remove some tags */

        doc.outputSettings().escapeMode(Entities.EscapeMode.extended);
        System.out.println(doc.html());

        return;
    }
}

Проблема с приведенным выше кодом заключается в том, что когда я использую расширенный режим выхода, выходные данные имеют атрибуты тега html, закодированные в html. Есть ли способ избежать этого? Использование escape-режима в качестве базового или xhtml не работает, так как некоторые нестандартные расширенные (например, ’) кодировки создают проблемы. Например, для HTML ниже,

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Test&reg;</title>
</head>
<body style="background-color:#EDEDED;">
<P>
   <font style="color:#003698; font-weight:bold;">Testing HTML encoding - &rsquo; &copy; with a <a href="http://www.google.com">link</a>
   </font> 
   <br />
</P>
</body>
</html>

Результат, который я получаю,

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
 <head>&NewLine;
  <title>Test&reg;</title>&NewLine;
 </head>&NewLine;
 <body style="background-color&colon;&num;EDEDED&semi;">&NewLine;
  <p>&NewLine; <font style="color&colon;&num;003698&semi; font-weight&colon;bold&semi;">Testing HTML encoding - &rsquor; &copy; with a <a href="http&colon;&sol;&sol;www&period;g
oogle&period;com">link</a></font> <br />&NewLine;</p>&NewLine;&NewLine;&NewLine;&NewLine;
 </body>
</html>

Можно ли как-то обойти эту проблему?


person sam    schedule 14.07.2011    source источник


Ответы (1)


Какой кодировку вывода вы используете ? (По умолчанию будет ввод, который, если вы загружаете с URL-адресов, будет варьироваться в зависимости от сайта).

Вероятно, вы захотите явно установить для него значение UTF-8, ASCII или какое-либо другое низкое значение, если вы работаете с системами, которые не могут работать с UTF-8. Если вы установите режим escape на base (по умолчанию), а набор символов на ascii, то любой символ (например, rsquo), который не может быть изначально представлен в выбранном наборе символов, будет выводиться как числовой escape.

Например:

String check = "<p>&rsquo; <a href='../'>Check</a></p>";
Document doc = Jsoup.parse(check);
doc.outputSettings().escapeMode(Entities.EscapeMode.base); // default

doc.outputSettings().charset("UTF-8");
System.out.println("UTF-8: " + doc.body().html());

doc.outputSettings().charset("ASCII");
System.out.println("ASCII: " + doc.body().html());

Дает:

UTF-8: <p>’ <a href="../">Check</a></p>
ASCII: <p>&#8217; <a href="../">Check</a></p>

Надеюсь это поможет!

person Jonathan Hedley    schedule 16.07.2011
comment
Любая идея, как я могу предотвратить побег &? Кажется, что он экранирован в любом наборе символов, а также когда для режима escape установлено значение Entities.EscapeMode.xhtml. - person Randy; 09.07.2017
comment
& всегда нужно экранировать для создания действительного HTML/XML, поэтому отключить это невозможно. - person Jonathan Hedley; 09.07.2017