是否可以删除不需要的标签的文本节点

时间:2016-02-02 10:31:49

标签: java html jsoup

我测试了Jsoup,但我无法删除不需要的标签的文本节点。 如果我错了方法,请发信息。 方法是:

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>

但我不想要<img>的文本节点(对其他不需要的标签也有效)......

所以结果更好:

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

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

P.S。问题是Java而不是Javascript !!!

2 个答案:

答案 0 :(得分:2)

假设您的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>

<强>输出:

    DECLARE @table TABLE
  (
     routeName VARCHAR(10)
  ) 

 insert into @table values 
('routeA'),  
('routeA'),  
('routeA'),  
('routeB'),  
('routeB'),  
('routeC'),  
('routeA')

SELECT routename,
       Dense_rank()
         OVER (
           ORDER BY routename) AS routeid
FROM   @table 

答案 1 :(得分:1)

您面临的问题是:<img> html标记不允许任何文本节点,即它没有结束标记。您示例中的</img>无效.html。图像不能像这样跨越内部文本。见here for reference

因此JSoup忽略了结束</img>,因为它无效。

一种方法是使用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);