当我解析本地HTML文件时,jsoup将锚元素中的引号更改为&模糊我的HTML。
让我们假设我想在以下HTML部分中将值“one”更改为“two”:
<div class="pg2-txt1">
<a class="foo" appareantly_a_javascript_statement='{"targetId":"pg1-magn1", "ordinal":1}'>one</a>
</div>
我得到的是:
<div class="pg2-txt1">
<a class="foo" appareantly_a_javascript_statement="{"targetId":"pg1-magn1", "ordinal":1}">two</a>
</div>
需要锚元素内的引号。我的代码现在看起来像这样:
File input = new File("D:/javatest/page02.html");
Document doc = Jsoup.parse(input, "UTF-8");
Element div = doc.select("div.pg2-txt1").first(); //anchor element only identifyable by parent <div> class
div.child(0).text("one"); //actual anchor element
我试过
doc.outputSettings().prettyPrint(false);
没有成功。
我能用jsoup实现这个目标吗?我是否必须使用不同的解析器,它会是什么样子。
非常感谢你。
答案 0 :(得分:0)
根据html spec JSoup表现得非常好:
默认情况下,SGML要求使用分隔所有属性值 双引号(ASCII十进制34)或单引号 标记(ASCII十进制39)。单引号可以包含在内 当值由双引号分隔时的属性值, 反之亦然。作者也可以使用数字字符引用 代表双引号(&#34;)和单引号(&#39;)。双倍 引号作者也可以使用字符实体引用
"
注意最后一句!
基本上这意味着,您需要appareantly_a_javascript_statement
属性中双引号的其他软件正在对其值进行一些不完整的解析。
我看到两个解决方案:
1)修改解释appeantly_a_javascript_statement值的函数
我无法帮助你,因为我不知道它在哪里完成。
2)通过正则表达式更改Jsoup输出。
这非常hacky ......
String html = doc.outerHtml();
boolean changed = false;
html = html.replaceAll("(=\"\\{)([^\"]+)(\")", "='{$2'");
do{
int oldLength = html.length();
html = html.replaceAll("(=')([^']+)(\\")([^\']+)(')", "$1$2\"$4$5");
changed = html.length() != oldLength;
}while(changed);
System.out.print(html);