这可能不是有史以来最好的问题,但是我真的无法解决这个问题。
我想做的是从下面的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
常量仍未定义。
谢谢。
答案 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
。