2017-09-07 22 views
1

以下のHTMLコンテンツをJsoupパーサを使用して解析する必要があります。 要件はいくつかのタグを削除し、以下の出力を得ることです。Jsoup - 選択した要素の解析

<html> 
 

 
<head> 
 
    <style type=\ "text/css\"> 
 
    body { 
 
     font: 12px Arial, Helvetica, sans-serif 
 
    } 
 
    
 
    tr { 
 
     font: 12px Arial, Helvetica, sans-serif; 
 
     padding: 0px 0px 0px 10px 
 
    } 
 
    </style> 
 
</head> 
 

 
<body> 
 

 
    <p>hello,<br>&nbsp;<br>We need to dispatch the below documents to you. Thanks for your cooperation.<br><br>Best Regards</p><br> 
 
    <img id=\ "logo_GMALE.png\" alt=\ "logo GMALE\" src=\ "https://www.GMALE.ch/logo.png\"> 
 

 
    <br><b>Test abc xyz</b><br><br>T +91 98 471 <br> 
 

 
    <a href=\ "mailto:[email protected]\">[email protected]</a><br><br><b>Département Team</b><br><br><b>GMALE Assurances</b><br>StreetName 2<br>Postbox 2100<br>Country<br><br>GMALE.ch<br><br>This is a private email contents.<br><br>This e-mail transmission 
 
    is intended for the named addressee(s) only. Its contents are private, confidential and protected from disclosure and should not be read, copied or disclosed by any other person. If you are not the intended recipient, we kindly ask you to notify the 
 
    sender immediately and to delete this e-mail.<br><br> 
 

 

 
</body> 
 
</html>

出力:

<p>hello,<br>&nbsp;<br>We need to dispatch the below documents to you. Thanks for your cooperation.<br><br>Best Regards</p><br> 
 

 
<br><b>Test abc xyz</b><br><br>T +91 98 471 <br>

私は以下のコード

入力して所望の出力を得ることができないのですこれまでに行わ210

コードは以下の通りです:次のHTMLのbodyを解析し、<a href=\ "mailto:[email protected]\">に至るまで、すべてのデータを抽出します。

Document doc = Jsoup.parse(content);  
List<Node> childNodes = doc.select("body").get(0).childNodes(); 
System.out.println("Elements : " + childNodes); 
StringBuilder finalContent = new StringBuilder(); 
for (Node node : childNodes) { 
    if (node instanceof Element) { 
     Element subElement = (Element) node; 
     if (!subElement.tagName().equals("img")) { 
      finalContent.append(subElement); 
     } 
    } else { 
     TextNode textNode = (TextNode) node; 
     if(!textNode.getWholeText().startsWith("<a")) { 
      finalContent.append(textNode); 
     } 
    } 
} 

答えて

0

あなたの問題は次のように定義することができます。あなたはこの角度からあなたの問題を見れば、あなたは、次のアプローチを試みることができます。

final Document doc = Jsoup.parse(content); 
final Elements elements = doc.select("body > *:not(img)"); 
final Iterator<Element> iterator = elements.iterator(); 
final StringBuilder finalContent = new StringBuilder(); 

Element current; 
while (iterator.hasNext() && !(current = iterator.next()).tagName().startsWith("a")) { 
    finalContent.append(current.toString()); 
    String siblingText = current.nextSibling().attr("text").trim(); 
    if (!siblingText.isEmpty()) { 
     finalContent.append(siblingText); 
    } 
} 

System.out.println(finalContent); 

は、まず私たちは、セレクタbody > *:not(img)<img>を除くすべての要素を選択します。次に、リストの最後に達するか、最初にa要素に達するまで、すべての要素を繰り返し処理します。また、コンテンツを含む兄弟テキストノードがあるかどうかを確認します。これは電話番号の場合で、HTMLタグ内に配置されておらず、<br>タグのいずれかの兄弟であるためです。この例を実行する

は、次のような出力を生成:もちろん

<p>hello,<br>&nbsp;<br>We need to dispatch the below documents to you. Thanks for your cooperation.<br><br>Best Regards</p><br><br><b>Test_firstname90 Test_lastname90</b><br><br>T +91 98 471<br> 

を使用すると、別の反復停止ルールを定義し、この例ではあなたにヒントを与えるために作成されました。私はそれが助けて欲しい

+0

ありがとうSzymon ..私はこの作業に取り組んでいます。私が必要とする出力は、あなたが共有するスニペットに入っていない最後の電話番号も持っています..また、すべてのimgタグはスニペット全体で削除する必要があります.. – Trin

+0

それを指摘してくれてありがとう。私はすべての 'img'タグを削除し、電話番号を保持するテキストノードを見つけるためにスニペットを少し変更しました。 –

+0

ありがとうSzymon .. 1つの質問.. <! - My Comment text - >のようなコメントがあり、そのコメントの後にすべてのテキストを削除したいのであれば、 "a"の代わりに。これについて何かを共有することができますか?このコメントはほとんどの場合静的になります。 – Trin