JSoupを使用してHTMLから特定のテキストを含む要素を選択したいと思います。 htmlは
<td style="vertical-align:bottom;text-align:center;width:15%">
<div style="background-color:#FFDD93;font-size:10px;margin:5px auto 0px auto;text-align:left;" class="genbg"><span class="corners-top-subtab"><span></span></span>
<div><b>Pantry/Catering</b>
<div>
<div style="color:#00700B;">✓ Pantry Car Avbl
<br />✓ Catering Avbl</div>
</div>
<div>
<div><span>Dinner is served after departure from NZM on 1st day.;</span>...
<br /><a style="font-size:10px;color:Red;" onClick="expandPost($(this).parent());" href="javascript:void(0);">Read more...</a>
</div>
<div style="display:none;">Dinner :2 chapati, rice, dal and chicken curry (NV) and paneer curry in veg &Ice cream.; Breakfast:2 bread slices with jam and butter. ; Omlet of 2 eggs (Non veg),vada and sambar(veg)..; coffee & Lime juice</div>
</div>
</div><span class="corners-bottom-subtab"><span></span></span>
</div>
「Pantry/Catering」というテキストを含むdiv要素を見つけたいです。私は試した
doc.select("div:contains(Pantry/Catering)").first();
しかし、これはうまくいかないようです。 Jsoupを使用してこの要素を取得するにはどうすればよいですか?
コードを実行すると、外側のdiv
が選択されますが、探しているのは内側のdiv
であると推測されます。 documentation は、「指定されたテキストを含む要素」を選択することを示しています。この単純なhtmlでは:
_<div><div><b>Pantry/Catering</b></div></div>
_
セレクターdiv:contains(Pantry/Catering)
は、両方に「パントリー/ケータリング」というテキストが含まれているため、2回一致します。
_<!-- First Match -->
<div><div><b>Pantry/Catering</b></div></div>
<!-- Second Match -->
<div><b>Pantry/Catering</b></div>
_
Jsoupは外部から一致するため、一致は常にこの順序になります。したがって、.first()
は常に外側のdiv
と一致します。内部のdiv
を抽出するには、.get(1)
を使用できます。
内部のdiv
を完全に抽出します:
_doc.select("div:contains(Pantry/Catering)").get(1)
_
OK。理解した。のようなことをしなければならなかった
doc.select("b:contains(Pantry/Catering)").first().parent().children().get(1).text();
助けてくれてありがとう!
これはあなたのためにも仕事をするはずです:
doc.selectFirst("div:containsOwn(Pantry/Catering)").text();
説明:
selectFirst(selector)-select()。first()の使用を回避するのに役立ちます
containsOwn(text)-指定されたテキストを直接含む要素を返す疑似セレクター。テキストは、contains(text)とは対照的に、その子孫ではなく、見つかった要素に表示される必要があります。