当前位置: 首页 > 知识库问答 >
问题:

仅在文本部分中将字符串替换为 jsoup

白哲茂
2023-03-14

我已经找到了几个有类似问题和有价值答案的主题,但我仍然在纠结这个:

我想用Jsoup解析一些html,这样我就可以替换,例如,

"changeme"

<changed>changeme</changed>

,但仅当它出现在html的文本部分时,如果它是标签的一部分,则不会。所以,从这个html开始:

<body>
<p><a href="http://changeme.html">test changeme app</a></p>
</BODY>
</HTML>

我想说的是:

<body>
<p><a href="http://changeme.html">test <changed>changeme</changed> app</a></p>
</BODY>
</HTML>

我尝试了几种方法,这种方法使我更接近预期的结果:

Document doc = null;
try {
    doc = Jsoup.parse(new File("tmp1450348256397.txt"), "UTF-8");
} catch (Exception ex) {
}

Elements els = doc.body().getAllElements();
for (Element e : els) {
    if (e.text().contains("changeme")) {
        e.html(e.html().replaceAll("changeme","<changed>changeme</changed>"));
    }
}
html = doc.toString();
System.out.println(html);

但使用这种方法,我发现了两个问题:

<body>
<p><a href="http://<changed>changeme</changed> .html">test
    <changed>
        changeme
    </changed> 
app</a></p>
</BODY>
</HTML>

>

  • 换行符在我引入的新元素之前和之后插入。这不是一个真正的问题,因为如果我使用#change#进行替换,并且在doc.toString()之后,我可以将它们再次替换为所需的值(用

    真正的问题是:href中的URL已被修改,我不希望它发生。

    想法?Thx。

  • 共有1个答案

    伯向晨
    2023-03-14

    这是我的解决方案:

    String html=""
        +"<p><a href=\"http://changeme.html\">"
        +   "test changeme "
        +   "<div class=\"changeme\">"
        +     "inner text changeme"
        +   "</div>"
        +   " app</a>"
        +"</p>";
    Document doc = Jsoup.parse(html);
    Elements els = doc.body().getAllElements();
    for (Element e : els) {
        List<TextNode> tnList = e.textNodes();
        for (TextNode tn : tnList){
            String orig = tn.text();
            tn.text(orig.replaceAll("changeme","<changed>changeme</changed>")); 
        }
    }
    
    html = doc.toString();
    System.out.println(html);
    

    TextNodes始终是叶节点,即它们不包含更多的HTML元素。在最初的方法中,您用替换了< code>changme字符串的新HTML替换元素的HTML。您只需检查changeme是否是TextNodes内容的一部分,但是您会替换元素的HTML字符串中的所有出现的内容,包括TextNodes之外的所有出现的内容。

    我的解决方案基本上像你的一样工作,但我使用JSoup方法文本Nodes()。这样我就不需要进行类型转换。

    P.S.当然,我的解决方案和您的解决方案都将包含<code>

     类似资料:
    • 我试图开发一个由多个数组和文本视图组成的应用程序,我遇到了一个问题。 我有3个文本视图和2个数组。 我的一个数组包含句子。我的第一个问题是如何突出每个句子中的特定单词?例如:“这是我的第一个数组项”,我需要突出显示字符串中的一个单词,这样当它显示在文本视图1中时,它就会像这样出现..."这是我的第一个数组物品" 我的另一个数组包含单词。它们显示在textview2中,也应高亮显示。我的下一个问题是

    • 问题内容: 我使用正则表达式从网页中获取字符串,并且该字符串的一部分可能包含我想替换为其他内容的内容。这怎么可能呢?我的代码是这样的,例如: 问题答案:

    • 主要目标是用hashmap中的值替换字符串中的一些单词作为关键字(关键字是文本中的单词)。钥匙的格式不同。例如:主文本:“Lookahead和Lookahead,统称为Lookahead,是[0-23]断言”hashmap:{Lookahead=test1,Lookahead=test2,Lookahead=test3,[0-23]=newvalue}预期输出:“test1和test2,统称为te

    • 我有一个将sql查询读取为字符串的方法,需要将所有“\”替换为“\”。这样做是为了防止\n和\r被处理为输出中的换行符。 样本输入 (\nSELECT\na.population_id\n,a.empi_id\n\r,a.encounter_id\n,SPLIT_PART(MIN(a.service_date||'|'|| a.norm_numeric_value),'|',2)::FLOAT为e

    • 我有以下字符串输出: 但是我想在Java中有如下格式的输出 请帮帮我。 我正在将对象转换为json数据。请参见以下代码 我想将此应用于使用java 7的jsonString变量,就像不使用java 8一样

    • 问题内容: 我正在尝试获取字符串的前10个字符,并想用替换空格。 我有 但是我不确定下一步该怎么做。 我想要绳子 这是对字符串的测试。 成为 this_is_th 问题答案: 只需使用str_replace: 您可以在上一个和呼叫之后执行此操作,如下所示: 但是,如果您想花哨的话,可以一行完成: