Jsoup中属性值的字符集

时间:2016-11-17 16:20:10

标签: java html jsoup ascii kotlin

我使用Jsoup,我需要在ascii-encoding中获取html文档中所有标签的属性值,并保持原样,而不进行转换。

所以,我有以下html文档

<!DOCTYPE html>
<head>
    <meta charset="ascii">        
</head>
<body>
    <div title="2 &gt; 1, 1 > 0, &agrave; vs &egrave;">
        3 &gt; 2,  1 > 0
    </div>
</body>

我想通过Jsoup解析。

我需要完全按原样提取title attribite的值:2 &gt; 1, 1 > 0, &agrave; vs &egrave;

我已经创建了一个Document对象doc,如下所示(它位于Kotlin,但我不认为这里很重要):

val charset = Charset.forName("ascii")
val doc = Jsoup.parse(File("test.html").readText(charset))
doc.outputSettings().charset(charset)

当我通过

打印出文档时
println(doc.toString())

我得到以下字符串

<!doctype html>
<html>
 <head> 
  <meta charset="ascii"> 
 </head> 
 <body> 
  <div title="2 > 1, 1 > 0, &agrave; vs &egrave;">
    3 &gt; 2 
  </div> 
 </body>
</html>

与文件内容的区别在于title属性值(&gt;在字符串>中转换为"2 > 1"),而文档的其余部分则正常。

然后,检查属性值

 doc.body().select("div").forEach { div -> println("title = ${div.attr("title")}") }

生成以下字符串

title = 2 > 1, 1 > 0, à vs è

请注意,&agrave;&egrave;已转换为àè

我的问题是:在Jsoup中,如何获取html标签的属性值,保留它们在输入文件中的写入方式?

在上面的示例中,我需要获取字符串"2 &gt; 1, 1 > 0, &agrave; vs &egrave;"(因为它写在输入文件中)而不是"2 > 1, 1 > 0, &agrave; vs &egrave;" niether "2 &gt; 1, 1 &gt; 0, à vs è"

1 个答案:

答案 0 :(得分:0)

attr()方法返回没有HTML实体的String,我找不到保留HTML实体的方法。但是,您可以使用Jsoup.clean()方法将字符串中的字符转换为实体。

val charset = Charset.forName("ascii")
val doc = Jsoup.parse(File("test.html").readText(charset))
doc.body().select("div").forEach { div ->
    val title = Jsoup.clean("${div.attr("title")}", "", Whitelist.none(), Document.OutputSettings().charset(charset))
    println("title = $title")
}

结果是:

title = 2 &gt; 1, &agrave; vs &egrave;

当然,这对您的用例可能不是一个好的解决方案。