JSoup:访问多个HTML类中的数据

时间:2018-03-12 00:31:15

标签: html jsoup

我最近开始使用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”有关。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

根据我的理解,您可能会遇到以下一个或两个问题:

1)在HTML中,可以为元素分配多个类名。这就是Broccoli Fact所发生的事情。这些实际上是两个类:BroccoliFact。在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