web-dev-qa-db-ja.com

Jsoupは特定のテキストを持つ要素を検索します

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;">&#10003;&nbsp;Pantry Car Avbl
                <br />&#10003;&nbsp;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 &amp;Ice cream.; Breakfast:2 bread slices with jam and butter. ; Omlet of 2 eggs (Non veg),vada and sambar(veg)..; coffee &amp; 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を使用してこの要素を取得するにはどうすればよいですか?

9
tbag

コードを実行すると、外側の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)
_
14
Spectre

OK。理解した。のようなことをしなければならなかった

doc.select("b:contains(Pantry/Catering)").first().parent().children().get(1).text();

助けてくれてありがとう!

6
tbag

これはあなたのためにも仕事をするはずです:

doc.selectFirst("div:containsOwn(Pantry/Catering)").text();

説明:

selectFirst(selector)-select()。first()の使用を回避するのに役立ちます

containsOwn(text)-指定されたテキストを直接含む要素を返す疑似セレクター。テキストは、contains(text)とは対照的に、その子孫ではなく、見つかった要素に表示される必要があります。

ソース: https://jsoup.org/apidocs/org/jsoup/select/Selector.html#selectFirst-Java.lang.String-org.jsoup.nodes.Element-

1
harshainfo