具有特定文本的 Jsoup 查找元素

2022-09-04 06:31:59

我想使用JSoup从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>

我想找到包含文本“食品储藏室/餐饮”的div元素。我试过了

doc.select("div:contains(Pantry/Catering)").first();

但这似乎不起作用。如何使用 Jsoup 获取此元素?


答案 1

当我运行你的代码时,它选择外部,而我假设你寻找的是内部。文档说它选择“包含指定文本的元素”。在这个简单的 html 中:divdiv

<div><div><b>Pantry/Catering</b></div></div>

选择器匹配两次,因为两者都包含文本“食品储藏室/餐饮”:div:contains(Pantry/Catering)

<!-- First Match -->
<div><div><b>Pantry/Catering</b></div></div>

<!-- Second Match -->
<div><b>Pantry/Catering</b></div>

匹配项始终按该顺序排列,因为 jsoup 从外部匹配。因此,始终与外部 .要提取内部,您可以使用 。.first()divdiv.get(1)

完全提取内部:div

doc.select("div:contains(Pantry/Catering)").get(1)

答案 2

这也应该为您完成以下工作:

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-