2016-08-22 53 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> 
相關問題