【问题标题】:Is possible delete textnodes of undesired tags是否可以删除不需要标签的文本节点
【发布时间】:2016-02-03 00:50:08
【问题描述】:

我测试了 Jsoup,我无法删除不需要的标签的文本节点。 如果我错误的方法,Idk。 方法是:

String pretty = Jsoup.clean("<img src=\"marco\">Capretta</img><i>Sono misterioso</i><p color=\"white\"><font size=\"5\">Ciao</p><p>some text</p><br/> <p>another text</p></font>" , "", Whitelist.basic().addTags("br", "p","i"), new Document.OutputSettings().prettyPrint(true));
System.out.println(pretty);

结果是:

Capretta
<i>Sono misterioso</i>
<p>Ciao</p>
<p>some text</p>
<br> 
<p>another text</p>

但我不想要&lt;img&gt; 的文本节点(对其他不需要的标签也有效)...

所以结果更好所以:

<i>Sono misterioso</i>
<p>Ciao</p>
<p>some text</p>
<br> 
<p>another text</p>

我也可以有不同的html...

附:问题是针对 Java 而不是 Javascript !!!

【问题讨论】:

    标签: java html jsoup


    【解决方案1】:

    假设您的 HTML 足够简单。

    您可以先通过parsing HTML 然后检索children of body tag 来实现此目的

    String pretty = Jsoup.clean("<img src=\"marco\">Capretta</img><i>Sono misterioso</i><p color=\"white\"><font size=\"5\">Ciao</p><p>some text</p><br/> <p>another text</p></font>" , "", Whitelist.basic().addTags("br", "p","i"), new Document.OutputSettings().prettyPrint(true));
    pretty= Jsoup.parse(pretty).getElementsByTag("body").get(0).children().toString();
    System.out.println(pretty);
    

    输出:

    <i>Sono misterioso</i>
    <p>Ciao</p>
    <p>some text</p>
    <br />
    <p>another text</p>
    

    【讨论】:

    • 是的,但我可以有不同的 html,所以它不起作用。
    • @MirkoCianfarani 是的,我相信你有它的理由。但我从来不需要清理它们。
    • 总有第一次,看来最后一个缓存是“最古老的”正则表达式。但我等待其他用户给予良好的回应
    【解决方案2】:

    您面临的问题是:&lt;img&gt; html 标签不允许包含任何文本节点,即它没有结束标签。您在示例中使用的 &lt;/img&gt; 不是有效的 html。图像不能像这样跨越内部文本。见here for reference

    所以 JSoup 忽略了结束的 &lt;/img&gt;,因为它无效。

    一个出路是使用Jsoup的XML解析器:

    String html = "<img src=\"marco\">Capretta</img><i>Sono misterioso</i>"
                + "<p color=\"white\"><font size=\"5\">Ciao</p>"
                + "<p>some text</p><br/> <p>another text</p></font>";
    Document xmldoc = Jsoup.parse(html, "",Parser.xmlParser());
    Elements imgs = xmldoc.select("img");
    imgs.remove();
    
    System.out.println(xmldoc);
    

    【讨论】:

    • 同意...是的,您的意思是正确的,'' 包含内部文本!像文本节点。这段代码也可以工作
    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2019-10-03
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多