Jsoup中的属性值的字符集
我使用Jsoup,我需要以ascii编码的方式获取html文档中所有标签的属性值,而不用转换它们。
所以,我有以下的HTML文件
0, à vs è"> 3 > 2, 1 > 0
我想用Jsoup来解析。
我需要完全按照原样提取title
属性的值: 2 > 1, 1 > 0, à vs è
2 > 1, 1 > 0, à vs è
。
我创建了一个Document
对象doc
如下(这是在Kotlin,但我不认为这很重要):
val charset = Charset.forName("ascii") val doc = Jsoup.parse(File("test.html").readText(charset)) doc.outputSettings().charset(charset)
当我打印出的文件的方式
println(doc.toString())
我得到以下字符串
1, 1 > 0, à vs è"> 3 > 2
其与文件内容的title
属性值( >
在字符串"2 > 1"
被转换成>
)不同,而文档的其余部分是OK的。
然后,检查属性值
doc.body().select("div").forEach { div -> println("title = ${div.attr("title")}") }
产生以下字符串
title = 2 > 1, 1 > 0, à vs è
注意,这à
和è
转化为à
和è
。
我的问题是:在Jsoup中,我怎样才能获得html标签的属性值,保留它们在输入文件中的写法?
在上面的例子中,我需要得到字符串"2 > 1, 1 > 0, à vs è"
(因为它写在输入文件中)而不是"2 > 1, 1 > 0, à vs è"
niether "2 > 1, 1 > 0, à vs è"
。
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 > 1, à vs è
当然,这可能不是一个很好的解决方案。