Jsoup寻找特定文本的元素

13

我想使用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获取此元素?

3个回答

19
当我运行您的代码时,它选择了外部的
标签,而我认为您要查找的是内部的
标签。根据文档所述,它选择“包含指定文本的元素”。在这个简单的HTML中:
<div><div><b>Pantry/Catering</b></div></div>
选择器 div:contains(Pantry/Catering) 会匹配两次,因为它们都包含文本“Pantry/Catering”:
<!-- 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)

我正在尝试学习这个,但如果div不是第一个内部div会发生什么? - Kick Buttowski
1
@KickButtowski 结果中元素的顺序与它们在文本中出现的开标签的顺序相同。否则,如果您事先不知道它的位置,则可以通过迭代选择结果来查找该元素或匹配更具体的内容(例如 b:contains(Pantry/Catering) ),然后使用 .parent() 往回工作。 - Spectre
谢谢。为什么这段代码不能给我想要的结果?doc = Jsoup.parse(input, null); Elements el = doc.select("div"); if (el.contains("Pantry/Catering")) { System.out.println(el.text()); } - Kick Buttowski
1
Elements 中的 contains 是来自 Collection 接口,用于测试是否包含特定的 Element,而不是用于检查文本内容。此外,请确保您理解 ElementElements 之间的区别。 - Spectre
@Spectre - 我不太明白。我尝试了 doc.select("div:contains(Pantry/Catering)").get(1),但对我来说仍然不起作用。顺便说一下,我发布的代码中只有一个 "Pantry/Catering"。那么你是如何匹配两次的? - tbag
@tbag :contains() 伪选择器匹配包含指定文本的元素,可以直接包含,也可以包含在任意子孙元素中。在最简单的情况下,<a><b>text</b></a>,b 直接包含 'text'。a 也包含 'text',因为它包含 b,而 b 包含 'text'。 - Spectre

8

6

好的,我已经理解了。需要做的是:

doc.select("b:contains(储藏室/餐饮)").first().parent().children().get(1).text();

感谢您的帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接