使用Cheerio从<ul>获取<li>下的hrefs

时间:2019-03-24 14:47:35

标签: javascript node.js cheerio

这可能不是有史以来最好的问题,但是我真的无法解决这个问题。

我想做的是从下面的html获取hrefs。

gulp gulpSass

这是从使用Cheerio的Node.js中获得的。

<ul id="nav-products">
  <li><a class="" href="/shop/hats/">yellow good looking hat</a></li>
  <li><a class="" href="/shop/shoes/">cat feet holders</a></li>
</ul>

但是,我尝试了多种方法,但没有一种起作用。例如:

const fs = require("fs"); const cheerio = require("cheerio") const html = fs.readFileSync('text.html', "utf8") const $ = cheerio.load(html); $('#nav-products').each((i, el) => { const category = $(el).text(); const children = $(el).children(); console.log(children.attr('href')); console.log(category); });

但是const link = $(el).attr('href'); / link常量仍未定义。 谢谢。

2 个答案:

答案 0 :(得分:0)

在您的代码段中,kwargs: {'baz': 2} MyMeta.__new__.fields: {'foo': 0} attr["fields"]: {'bar': 1} 包含无序列表的列表项,但是children属性是在锚元素上定义的,这些锚元素又是其列表项父级的子级。因此,您需要迭代href并让每个孩子的孩子得到锚点物品。

children

编辑:这是@ 82Tuskers建议的使用$('#nav-products').each((i, ul) => { const children = $(ul).children(); children.each((i, li) => { const children = $(li).children(); children.each((i, a) => { console.log($(a).attr('href')); console.log($(a).text()) }) }) }); 的示例

find()

我的建议是通过使用选择器来简化此工作,选择器的作用范围如下:$('#nav-products').each((i, ul) => { const children = $(ul).children(); const selectedAnchors = $(ul).find("A"); selectedAnchors.each((i, a) => { console.log($(a).attr('href')); console.log($(a).text()) }) }); 列表的列表项的锚元素:

#nav-products

您可以尝试repl.it上的所有代码段

答案 1 :(得分:0)

确保您要迭代a

let links = $('a').map((i, a) => {
  return {
    text: $(a).text(),
    href: $(a).attr('href')
  }
}).get()

通常,如果您要对数据进行一些有用的操作,则希望使用map而不是each