我最近开始使用JSoup进行HTML数据抓取,我在jsoup.org上找不到关于如何找到嵌套在其他div类中的div类的足够详细信息。
<div class="Food">
<a href="/eating/101" class="Eating">
<div class="Groceries">
<div class="Vegtables">
<div class="LeafyGreens"
<img src="https://RealisticBroccoli.svg" alt="" class="Broccoli-logo"></div>
<div class="Broccoli Fact">Fun Fact About Broccoli:</div>
</div></a></div>
<div class="Food">
<a href="/eating/102" class="Eating">
<div class="Groceries">
<div class="Vegtables">
<div class="LeafyGreens"
<img src="https://CartoonBroccoli.svg" alt="" class="Broccoli-logo"></div>
<div class="Broccoli Fact">Fun Fact About Broccoli:</div>
</div></a></div>
我创建了一个我正在处理的类似HTML项目的简单版本。我知道似乎有过多的div标签,但是这使得这个问题对我来说很有挑战性。我想刮掉当A [href]正在进食时产生的西兰花事实的HTML文本/ 101而没有从吃/ 102中剔除事实。 根据我的经验,我不能使用一条指令刮掉“Broccoli Fact”类,它也不会产生任何输出。我认为它与a href“/ eating / 101”有关。谢谢你的帮助!
答案 0 :(得分:0)
根据我的理解,您可能会遇到以下一个或两个问题:
1)在HTML中,可以为元素分配多个类名。这就是Broccoli Fact
所发生的事情。这些实际上是两个类:Broccoli
和Fact
。在Jsoup的CSS选择器中,您可能也想要同时应用这两个类。这可以通过简单地连接类来实现。请注意,JSopu CSS中的类选择器确实包含带有前一个点的类名:.Broccoli
和.Fact
因此连接为您提供
div.Broccoli.Fact
2)在你给出的HTML中,有一个以上的Broccoli Fact,但你只想得到第一个。有几种方法可以解决这个问题。如果没有更多关于任务的背景知识,哪一个是最好的。但是,这里有一些建议:
a)收集所有有趣的西兰花事实,但只使用第一个。由于Jsoup返回实现List接口的Elements
,因此您可以非常轻松地访问第一个元素。
b)使用更精确的CSS选择器。这样的事情可以奏效:
div.Food>a[href$=101] div.Broccoli.Fact
看看这里了解JSoup CSS选择器:https://jsoup.org/cookbook/extracting-data/selector-syntax