仅使用 Jsoup 从子节点中选择?

Posted

技术标签:

【中文标题】仅使用 Jsoup 从子节点中选择?【英文标题】:Selecting only from child nodes using Jsoup? 【发布时间】:2013-09-18 19:18:07 【问题描述】:

我目前正在使用带有许多第一级 <li> 元素的 <ul> 元素。我想得到那些元素,而且只有那些元素。但是,当我使用 Jsoup 选择器或 getElementsByTag 获取它们时,它还会返回这些第一级 <li> 元素中的 <li> 元素。

我该怎么做才能只获得一级<li> 元素?

代码如下:

Elements bundleList =  indieGala.select("section.games_bundle_box2")
                        .get(0).select("ul.unlock")
                        .get(0).getElementsByTag("li");

这是html

<section class="games_bundle_box2">
  <div class="games-container">

    <!-- List Game Unlocked -->
    <ul class="unlock">

      <!-- Item -->
      <li>
        <!-- Preview Thumb -->
        <a href="#game1" class="fancybox-various" title="Desura &amp; Steam for Windows and Mac - This game has been GreenLighted on Steam and all buyers of The IndieGala Flashpoint bundle will receive Steam keys in a few weeks!">
          <span class="tier1">
            Pay minimum 
            <em class="color-text">
              $1
            </em>
            to get Steam &amp; Desura keys! 
          </span>
          <span class="boxed">
          </span>
          <span class="steam-temp">
          </span>
          <span class="desura-icon">
          </span>
          <img src="img_game/ig-flashpoint/knytt.jpg" >
          <!-- 110 x 110 -->
          <span class="item-title">
            Knytt Underground
          </span>
        </a>
        <!-- End Preview Thumb -->

        <!-- Pop-Up -->

        <div id="game1" class="modal_content">

          <!-- Video Game Box -->
          <div class="game_movie">
            <iframe   src="http://www.youtube.com/embed/NwZ2Z7WRQrI?rel=0&amp;vq=hd720" frameborder="0" allowfullscreen="">
            </iframe>
          </div>
          <!-- End Video Game Box -->

          <!-- Game Description -->
          <div class="game_description">
            <h2>
              <a href="http://www.desura.com/games/knytt-underground" target="_blank">
                Knytt Underground
              </a>
            </h2>
            <a href="http://nifflas.ni2.se/" target="_blank">
              Nifflas' Games
            </a>
            <p style="font-weight: bold;">
              IMPORTANT NOTE: This game has been accepted on Steam. As soon as it will available on the Steam store, all buyers will receive a Steam key for it.
            </p>
            <p>
              Immerse yourself in a unique and challenging underground adventure!
            </p>
            <p>
              Knytt Underground is the latest iteration in the critically acclaimed Knytt series. It takes place in the same universe as Knytt Stories, the renowned indie game from Nicklas Nygren, a.k.a. 'Nifflas'.
            </p>
            <p>
              Each room in the huge map offers a small challenge to overcome using the unique tried and tested mechanics that have already reached over 1 million fans worldwide. Blending zen-like gameplay; enjoy an unparalled sense of freedom by running, jumping, climbing, swinging and bouncing. Knytt Underground delivers a unique and captivating, platform adventure experience allowing you to explore over 1,800 rooms and complete multiple story-driven quests. 
            </p>
            <p>
              <a href="#" target="_blank">
                System requirements
              </a>
            </p>
            <p>
              Operating system: Windows (XP / Vista / 7 / 8) or Mac OS 10.6
              <br>
              OpenGL compatible graphics card with 512MB memory or more.
              <br>
              A 2ghz CPU is needed.
              <br>
              The OS X version requires Mac OS 10.6 and must be running in 64-bit mode.
              <br>
            </p>
          </div>
        </div>
        <!-- End Pop-Up -->
      </li>
      <!-- End Item -->

      <li>
        <a href="#game2" class="fancybox-various" title="Steam for Windows">
          <span class="boxed">
          </span>
          <span class="steam-icon">
          </span>
          <img src="img_game/ig-flashpoint/saira.jpg" >
          <span class="item-title">
            Saira
          </span>
        </a>
        <div id="game2" class="modal_content">
          <div class="game_movie">
            <iframe   src="http://www.youtube.com/embed/iFPaXcLF5b0?rel=0&amp;vq=hd720" frameborder="0" allowfullscreen="">
            </iframe>
          </div>
          <div class="game_description">
            <h2>
              <a href="http://store.steampowered.com/app/48900/" target="_blank">
                Saira
              </a>
            </h2>
            <a href="http://nifflas.ni2.se/" target="_blank">
              Nifflas' Games
            </a>
            <p>
              Saira is a puzzle platformer with non-linear gameplay and a whole universe for you to explore. The game is heavily influenced by classic puzzle adventure games and uses a new unique graphical style combining high resolution photography into a lush and mysterious world.
            </p>
            <p>
              The eponymous Saira is a photographer who specializes in digitally capturing dangerous places and animals across the universe. For reasons unknown, she finds herself as the only remaining person in the entire galaxy. Saira has no weapons, she will use only her mind and agility to progress through seven star systems and over 60 well-crafted puzzles. Over two hours of originally-scored music will help her maintain focus and unlock one of six vastly unique endings.
            </p>
            <ul>
              <li>
                Over 60 well-crafted puzzels.
              </li>
              <li>
                A universe full of surprising creatures and locations for you to explore.
              </li>
              <li>
                11 layers of high definition parallax scrolling and a two hour soundtrack gives the universe of Saira it's unique atmosphere.
              </li>
              <li>
                Non-linear gameplay
              </li>
              <li>
                Multiple endings
              </li>
            </ul>
            <p>
              <a href="#" target="_blank">
                System requirements
              </a>
            </p>
            <p>
              OS: Windows 2000 or later
              <br>
              Processor: 2.1Ghz or higher
              <br>
              DirectX®: 9
              <br>
              Hard Drive: 250 MB for downloading the game + 200 MB for playing
              <br>
            </p>
          </div>
        </div>
      </li>
      <!-- End Item -->

      <!-- Item -->
      <li>
        <!-- Preview Thumb -->
        <a href="#game3" class="fancybox-various" title="Steam for Windows">
          <span class="boxed">
          </span>
          <span class="steam-icon">
          </span>
          <img src="img_game/ig-flashpoint/musaic.jpg" >
          <!-- 110 x 110 -->
          <span class="item-title">
            Musaic Box
          </span>
        </a>
        <!-- End Preview Thumb -->

        <!-- Pop-Up -->
        <div id="game3" class="modal_content">

          <!-- Video Game Box -->
          <div class="game_movie">
            <iframe   src="http://www.youtube.com/embed/ZswOQE8MDbo?rel=0&amp;vq=hd720" frameborder="0" allowfullscreen="">
            </iframe>
          </div>
          <!-- End Video Game Box -->

          <!-- Game Description -->
          <div class="game_description">
            <h2>
              <a href="http://store.steampowered.com/app/29130/" target="_blank">
                Musaic Box
              </a>
            </h2>
            <a href="http://kranx.com/en/" target="_blank">
              KranX Productions
            </a>
            <br>
            <br>
            <p>
              Uncover all of your grandfather's sheet music, hidden in his home amongst a treasure trove of gorgeous antiques and musical relics. Melodious music box games will let you piece these special compositions together and unleash their symphonious secrets. Unlock Creative Mode and write your own outstanding arrangements. With a house full of secrets and a box full of music the aural excitement never ends.
            </p>
            <ul>
              <li>
                Beautifully rendered graphics
              </li>
              <li>
                Entrancing musical score
              </li>
              <li>
                Unlock musical mysteries!
              </li>
            </ul>
            <p>
              <a href="#" target="_blank">
                System requirements
              </a>
            </p>
            <p>
              Supported OS: Microsoft® Windows® 2000/XP/Vista
              <br>
              Processor: 800Mhz
              <br>
              Graphics: DirectX® compatible with 16 MB of Video Memory
              <br>
              Sound: DirectX® compatible Sound Card
              <br>
              DirectX® Version: DirectX 8.0
              <br>
              Memory: 256 MB RAM (512+MB recommended)
              <br>
              Hard Drive: 54 MB or more
              <br>
            </p>
          </div>
          <!-- End Game Description -->

        </div>
        <!-- End Pop-Up -->

      </li>
      <!-- End Item -->

      <!-- Item -->
      <li>
        <!-- Preview Thumb -->
        <a href="#game4" class="fancybox-various" title="Steam for Windows">
          <span class="boxed">
          </span>
          <span class="steam-icon">
          </span>
          <img src="img_game/ig-flashpoint/yumsters.jpg" >
          <!-- 110 x 110 -->
          <span class="item-title">
            Yumsters 2: Around the World
          </span>
        </a>
        <!-- End Preview Thumb -->

        <!-- Pop-Up -->
        <div id="game4" class="modal_content">

          <!-- Video Game Box -->
          <div class="game_movie">
            <iframe   src="http://www.youtube.com/embed/m19AcPO_LMQ?rel=0&amp;vq=hd720" frameborder="0" allowfullscreen="">
            </iframe>
          </div>
          <!-- End Video Game Box -->

          <!-- Game Description -->
          <div class="game_description">
            <h2>
              <a href="http://store.steampowered.com/app/29120/" target="_blank">
                Yumsters 2: Around the World
              </a>
            </h2>
            <a href="http://kranx.com/en/" target="_blank">
              KranX Productions
            </a>
            <p>
              Not only are these Yumsters crazy for strawberries, they can rock the bongos. For the love of fruity music, help them earn money by cleaning gardens to promote their band. To really skyrocket, Yumsters need the best equipment to win the ultimate grand prize at the fairy town music showdown. Get fruitilicious in five vibrant locations of Yumsters 2, a sweet Match 3 puzzler. 
            </p>
            <p>
              Key Features:
            </p>
            <ul>
              <li>
                Match 3, drag-n-drop 
              </li>
              <li>
                Rhythm-based gameplay 
              </li>
              <li>
                Adorable characters 
              </li>
              <li>
                Win the grand prize! 
              </li>
            </ul>
            <p>
              <a href="#" target="_blank">
                System requirements
              </a>
            </p>
            <p>
              Operating System: Microsoft® Windows® XP/Vista
              <br>
              Processor: 600 Mhz
              <br>
              Memory: 256 MB (512+ MB recommended)
              <br>
              Hard Disk Space: 54 MB (or More) Available HDD Space
              <br>
              Video Card: DirectX® compatible with 16 MB of Video Memory
              <br>
              Sound Card: DirectX® compatible Sound Card
              <br>
              DirectX® Version: DirectX® 7.0
              <br>
            </p>
          </div>
          <!-- End Game Description -->

        </div>
        <!-- End Pop-Up -->
      </li>
      <!-- End Item -->      
<li style="width: 400px;font-weight: bold; margin-top: 20px; position: relative; left: 210px; font-size: 16px;">
Price BLOCKED at 
<span class="color-text">
$3.99
</span>
for the FIRST 8 HOURS
</li>
-->
          </ul>

          <!-- End List Game Locked -->

  </div>
</section>

【问题讨论】:

请 1) 显示您的代码,2) 显示示例 HTML 文件。 3) 展示你得到了什么,4) 展示你想得到什么。 你应该展示你的代码。这将使人们更容易帮助你,这意味着你也会得到更好的答案。正如杰里麦奎尔所说。 “帮我帮你”。祝你好运! :) 好的。在OP中包含代码和html。 不太明白我几乎无法理解你想要什么..jsoup.org/apidocs/org/jsoup/select/Selector.html “我想得到那些元素,而且只想要那些元素。”哪些元素? 【参考方案1】:

也许我忽略了一些东西,但是根据ul.unlock 的直接血统进行选择怎么样?您可以通过在选择器表达式中使用 &gt; 来做到这一点:

parent &gt; child:直接从父元素下降的子元素,例如div.content &gt; p 找到 p 元素;并且body &gt; * 查找body 标签的直接子代(source)

通过使用ul.unlock &gt; li,它应该只选择你想要的***li元素,例如:

ListIterator<Element> bundleList = indieGala.select("section.games_bundle_box2")
    .get(0)
    .select("ul.unlock > li")
    .listIterator();

assert Iterators.size(bundleList) == 5;

希望对你有帮助。

【讨论】:

到目前为止,没有一个答案会过滤掉子列表。考虑创建并发布sscce。 我没有这样解释这个问题,我认为问题在于子列表&lt;li&gt; 元素被重复,即它们是由getElementsByTag 的调用返回的,并且也包含在其中***&lt;li&gt; 元素。【参考方案2】:

这使您可以访问 ul 标记的所有直接子项 (li):

元素 lis = doc.select("section.games_bundle_box2").first().select("ul.unlock > li");

这是你想要的吗?

【讨论】:

【参考方案3】:

你可以简单地使用这个来寻找孩子 -

Elements bundleList = indieGala.select("section.games_bundle_box2").first().select("ul.unlock").first().children();

这应该比执行选择器更快,并且在你的情况下会给你你想要的确切结果。

【讨论】:

以上是关于仅使用 Jsoup 从子节点中选择?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 数据库从子节点 B 中指定的子节点 A 检索对象

XPath:从子节点获取父节点

如果它是使用 XPath 在 Scrapy 中的其他节点的父节点,如何从子节点获取文本

React 将参数从子组件传递给节点元素

仅选择与选择器匹配的父节点

removeChild() 方法从子节点列表中删除某个节点。如删除成功,此方法可返回被删除的节点,如失败,则返回 NULL。