列表的 cheerio 选择

cheerio selection of a list

在我需要抓取的页面上(使用 node.js 和 cheerio),我有这个模式:

<h2>
  <span id="2015"></span>
  <span class="ignore-me"></span>
</h2>
<div>
  <ol>
    <li>
      <a title="TITLE1" href="HREF1"></a>
      <a class="image" title="ignore-me-1" href="ignore-me-1"></a>
    </li>
    ...
    <li>
      <a title="TITLE2" href="HREF2"></a>
      <a class="image" title="ignore-me-2" href="ignore-me-2"></a>
    </li>
  </ol>
</div>

我想提取一个包含 TITLEs 和 HREFs 的列表。

我正在尝试这样的事情:

$('h2 > span[id="2015"]').next('ol > li > a').each(function(index, element) {
  console.log('title:', element.attr('title'), 'href:', element.attr('href'));
});

没有成功(each 循环从未进入...)。

有什么建议吗?

h2 标签没有 ID,因此您的选择器找不到任何结果,没有可循环的内容。

您可以通过循环定位标签轻松做到这一点。

$("a").each(function(i, e) {
    if (e.attr('title') && e.attr('href')) console.log("... stuff ...");
});

或者您可以给 h2 一个 ID,或者从您的选择器中删除该 ID。多种循环方式。

ol 元素实际上并不是 span#2015 的下一个元素。 ol 元素位于 div 内,它是 h2 的下一个元素。正确的树遍历是:

$('h2 > span[id="2015"]')
  .parent()
  .next('div')
  .find('ol > li > a:not([class])')
  .each(function() {
    var $el = $(this);
    console.log('title:', $el.attr('title'), 'href:', $el.attr('href'));
  });