jsoup ошибочно принимает токен как тег HTML - PullRequest
0 голосов
/ 25 июня 2018

Я получил html-фрагмент следующим образом:

<span class=#article-title#>About《About<SomeChineseChars》Blabla</span>

извините, здесь я использую символы латинского алфавита, так как редактор не позволяет вводить символы китайского языка

когда я попытаюсь извлечь текст из этого элемента, используя

doc.select(".article-title").text();

, в результате я получу следующее:

About《About》Blabla 

после отладки программирования, обнаружив, что

<SomeChineseChars> 

обрабатывался как тег HTML, и JSoup автоматически закрывал тег следующим образом:

<SomeChineseChars></SomeChineseChars> 

Итак, если есть что-либо, чтобы избежать этого, или если это ошибка?

- = - = - = ОБНОВЛЕНИЕ = - = - = -

после создания dom и проверки проанализированного html, вывод будет

Я не могу опубликовать img,поэтому, пожалуйста, нажмите меня, чтобы просмотреть его

Большое спасибо, Бен

Ответы [ 2 ]

0 голосов
/ 27 июня 2018
    Document doc = Jsoup.connect("http://gk.tj.gov.cn/gkml/00012525X/200804/t20080425_49468.shtml")
            .timeout(180 * 1000).get();
    String html = doc.outerHtml().replaceAll("<天津市企业实行商务卡结算财务管理暂行办法>", "&lt;天津市企业实行商务卡结算财务管理暂行办法&gt;");;
    doc = Jsoup.parse(html);
    System.out.println(doc.select("#span_docTitle").text());

Выход:

转发《关于印发 <天津市企业实行商务卡结算财务管理暂行办法> 的通知》的通知
0 голосов
/ 26 июня 2018

Я составил решение, взломав JSoup следующим образом:

  1. создайте новый пакет с именем org.jsoup.parser;
  2. настройте HtmlTreeBuilder

    public class TroilaHtmlTreeBuilder extends HtmlTreeBuilder {
    
    private String zh = "[\\u4e00-\\u9fa5]+";
    
    public TroilaHtmlTreeBuilder() {
    }
    
    @Override
    Element insert(Token.StartTag startTag) {
        if (startTag.tagName.matches(zh)) {
            Token.Character ch = new Token.Character();
            ch.data(startTag.toString());
            insert(ch);
            return null;
        }
        return super.insert(startTag);
    }
    
    public Document parse(Reader input, String baseUri) {
        return super.parse(input, baseUri, ParseErrorList.noTracking(), this.defaultSettings());
    }
    
    }
    

Не думаю, что это хороший способ решения проблемы, поэтому дайте мне знать, если у вас есть идея получше.

Кстати: большое спасибо@Abhilash за твою помощь!

...