2016-08-22 75 views
1

Jsoup将每个文本保存为文本节点,包括元素之间的\ r \ n内容。我想选择页面上的所有实际文本并选择其父项以删除该父项中的每个文本。如何使用Jsoup选择包含实际文本的所有元素?

我目前有这样的:

document.select("*:containsOwn(\n)").remove(); 
    for(int i = 1; i < document.size(); i++){ 
     if(document.get(i).hasText()){ 
      List<Element> removableElements = document.get(i).parent().getAllElements(); 
      for (Element e1 : removableElements) { 
       e1.remove(); 
      } 
     } 

    } 

它不删除包含所有textnodes \ n所以它试图去除体,因为这是具有在textnodes它的第一个元素。

我只想选择所有包含文字的元素,并做 element.parent()。children()。remove();

document.select("*:contains()"); 

也没有按我想要的方式工作。

这个问题与this问题有关,但不一样。

编辑:

输入:

<div> 
    <ul> 
     <li>some menu item</li> 
     <li>some menu item</li> 
     <li>some menu item</li> 
    </ul> 
</div> 
<div> 
    <h3>Tile of some text</h3> 
    <p></p> 
    <p>some text</p> 
    <ul> 
     <li>some other text</li> 
     <li>some other text</li> 
     <li>some other text</li> 
    </ul> 
</div> 

输出:

<li>some menu item</li> 
<li>some menu item</li> 
<li>some menu item</li> 
<h3>Tile of some text</h3> 
<p></p> 
<p>some text</p> 
<li>some other text</li> 
<li>some other text</li> 
<li>some other text</li> 
+0

你能添加一个输入和期望输出的例子? – TDG

+0

'

'在输出中与您的规则相矛盾“包含实际文字”。这意味着你必须允许特殊的情况“空p标签”,因为它可能只是一个更复杂的网站的例子,你会得到很多特殊情况,因为有很多文本级元素http:///stackoverflow.com/a/7130146/1661938您的相关/链接问题中存在类似问题:您需要一个通用解决方案,但提供一个特例。也许你应该重新考虑你的方法,或者在描述你的目标时要更加详细(例如:菜单总是一样的?)。 –

回答

1

空p标记的特殊情况下,期望的输出的一部分(尽管它违背了规则“包含实际文本”)需要特殊解析。对于更复杂的文档/ A解决方案,允许输出更多的空text-level elements,将需要额外的if语句来处理这些元素(if语句首先比较):

String htmlString = "<div><ul><li>some menu item</li><li>some menu item</li><li>some menu item</li></ul></div><div><h3>Tile of some text</h3><p></p><p>some text</p><ul><li>some other text</li><li>some other text</li><li>some other text</li></ul></div>"; 
Document doc = Jsoup.parse(htmlString); 

for (Element element : doc.getAllElements()) { 
    if(element.nodeName().equals("p") && element.childNodes().size()==0){ 
     System.out.println(element.toString()); 
    } 
    else if(element.childNodes().size()>0 && element.childNode(0).nodeName().equals("#text")){ 
     System.out.println(element.toString()); 
    } 
} 

输出:

<li>some menu item</li> 
<li>some menu item</li> 
<li>some menu item</li> 
<h3>Tile of some text</h3> 
<p></p> 
<p>some text</p> 
<li>some other text</li> 
<li>some other text</li> 
<li>some other text</li> 
相关问题