【问题标题】:jsoup - stop jsoup from making quotes into &jsoup - 阻止 jsoup 将引号插入 &
【发布时间】:2014-06-10 15:49:40
【问题描述】:

当我解析本地 HTML 文件时,jsoup 将锚元素内的引号更改为 & 模糊我的 HTML。

假设我想在以下 HTML 部分中将值“一”更改为“二”:

<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="{&quot;targetId&quot;:&quot;pg1-magn1&quot;, &quot;ordinal&quot;: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 实现吗?我是否必须使用不同的解析器,它会是什么样子。

非常感谢您。

【问题讨论】:

    标签: jsoup autoformatting


    【解决方案1】:

    根据html spec JSoup 的行为完全正常:

    默认情况下,SGML 要求所有属性值都使用 双引号(ASCII 十进制 34)或单引号 标记(ASCII 十进制 39)。单引号可以包含在 当值由双引号分隔时的属性值, 反之亦然。作者也可以使用数字字符引用 表示双引号 (") 和单引号 (')。对于双引号 引号作者也可以使用字符实体引用&amp;quot;

    注意最后一句话!

    基本上这意味着,您的其他需要在appareantly_a_javascript_statement 属性中使用双引号的软件正在对其值进行一些不完整的解析。

    我看到了两种解决方案:

    1) 修改解释appareantly_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("(=')([^']+)(\\&quot;)([^\']+)(')", "$1$2\"$4$5");
        changed = html.length() != oldLength;
    }while(changed);
    System.out.print(html);
    

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2018-09-05
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      相关资源
      最近更新 更多