2016-08-22 8 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質問に関連していますが、同じではありません。

EDIT:

入力:

<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

あなたはANを追加することができます入力と期待される出力の例? – TDG

+0

出力の「

」は、「実際のテキストを含む」ルールと矛盾します。これは、特別なケース「空のpタグ」を許可しなければならないことを意味します。これはたぶん複雑なWebサイトの例に過ぎないため、特別なケースがたくさんあります。テキストレベルの要素http: /stackoverflow.com/a/7130146/1661938関連する/リンクされた質問にも同様の問題が存在します。一般的な解決方法が必要ですが、特別な場合があります。たぶん、あなたのアプローチを考え直すか、ターゲットを説明するのにもっと詳しく説明する必要があります(たとえば、メニューは常に同じですか?)。 –

答えて

1

空のpタグの特別な場合を意図出力(の一部として、それが矛盾していてもルール "は実際のテキストを含む")は特別な解析が必要です。より複雑な文書/出力に複数の空text-level elementsを許可、ためのソリューション文はそれらの要素を処理する場合は、追加が必要となる(文の場合は、最初の比較):

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> 
関連する問題