首页 > 解决方案 > DomCrawler,使用 first() 或 last() 或 eq() 在特定位置选择类

问题描述

我对class在它的兄弟姐妹之间选择一个有点困惑......Html结构如下。

<ul class="pipeLink">
  <li class="pg">1</li><li class="pg"><a href="/wedding/clientList/?pn=2&amp;tdfkn=14">2</a></li>
  <li class="pg"><a href="/wedding/clientList/?pn=3&amp;tdfkn=14">3</a></li>
  <li class="pg"><a href="/wedding/clientList/?pn=4&amp;tdfkn=14">4</a></li>
  <li class="pg"><a href="/wedding/clientList/?pn=5&amp;tdfkn=14">5</a></li>
  <li class="pg"><a href="/wedding/clientList/?pn=6&amp;tdfkn=14">6</a></li>
  <li class="pg"><a href="/wedding/clientList/?pn=7&amp;tdfkn=14">7</a></li>
  <li class="pg"><a href="/wedding/clientList/?pn=8&amp;tdfkn=14">8</a></li>
  <li class="lastChild">
      <a href="/wedding/clientList/?pn=2&amp;tdfkn=14">next 30</a></li>
</ul>

页面中有 2 个ul.pipeLine类。在页面的顶部和底部。我只想抓住第一个或第二个ul.pipeLine并在其中迭代 a 标签的属性。所以我用下面的代码试了一下。

$links = $response->filter("ul.pipeLink")->last()->each(function($node){
    return $node->filter("li a")->attr("href");
});

但是当我使用last()or first()oreq(0)等​​时......它只在 a 标签内获取一个属性,没有别的。虽然我只想抓取ul.pipeLine页面中的一个类并在其中进行迭代。

我的意思是预期的输出应该是:

/wedding/clientList/?pn=2&amp;tdfkn=14
/wedding/clientList/?pn=3&amp;tdfkn=14
/wedding/clientList/?pn=4&amp;tdfkn=14
/wedding/clientList/?pn=5&amp;tdfkn=14
/wedding/clientList/?pn=6&amp;tdfkn=14
/wedding/clientList/?pn=7&amp;tdfkn=14
/wedding/clientList/?pn=8&amp;tdfkn=14

但这就像:

/wedding/clientList/?pn=2&amp;tdfkn=14

有可能实现吗?

标签: phpweb-scrapingdomcrawler

解决方案


好的,我解决了这个问题并将其发布在这里,作为以后遇到此问题的任何人的答案。

$links = $response->filter("ul.pipeLink")->last()->children("li a")->each(function($node){
    return $node->attr("href");
});

推荐阅读