如何使用 cheerio 遍历结果
how to loop over results using cheerio
我用 python 和漂亮的汤成功地做到了这一点,但现在我想把它移植到 Node.js
我的问题是循环没有将每个项目放入数组中它自己的对象中,而是像这样将所有东西放入一个中:
[
{
numbers: '123987456789',
letters: 'ABCDEFG'
}
]
而不是:
[
{
numbers: '123',
letters: 'A'
},
{
numbers: '987',
letters: 'B
}
]
棘手的部分是 div 具有相同的 ID,因此我需要在 div 的数组中获取特定的 ID。
在 Python 中,我这样做了,然后使用 append
将项目添加到空列表中
myDivs = soup.select('#my-divs')[2]
numbers = myDivs('text.numbers')
labels = myDivs('text.labels')
Node.js
exports.scrapeData = async (req, res) => {
const html = await Axios.get(
"https://example.com"
);
const $ = await cheerio.load(html.data);
let tests = [];
$("#my-divs:eq(2)").each((i, elem) => {
tests.push({
numbers: $(elem).find("text.numbers").text(),
labels: $(elem).find("text.labels").text(),
});
});
console.log(tests);
html:
<div id="my-divs">
<text class="numbers">123</text>
<text class="labels">A</text>
<text class="numbers">987</text>
<text class="labels">B</text>
</div>
<div id="my-divs">
<text class="numbers">567</text>
<text class="labels">C</text>
<text class="numbers">543</text>
<text class="labels">D</text>
</div>
这种方法怎么样:查找所有 .numbers
,并且对于每个 return 一个对象,其中包含自己的 .text()
和紧随其后的 .labels
使用Cheerio 的 .next()
:
exports.scrapeData = async (req, res) => {
const html = await Axios.get("https://example.com");
const $ = await cheerio.load(html.data);
const tests = $("#my-divs:eq(2)").find(".numbers").map(function () {
return {
numbers: $(this).text().trim(),
labels: $(this).next(".labels").text().trim(),
}
}).toArray();
console.log(tests);
});
Cheerio 的 .map()
允许在上下文中使用 this
,而 Cheerio 的 .toArray()
从 Cheerio 对象中提取底层 JavaScript 数组。
我用 python 和漂亮的汤成功地做到了这一点,但现在我想把它移植到 Node.js
我的问题是循环没有将每个项目放入数组中它自己的对象中,而是像这样将所有东西放入一个中:
[
{
numbers: '123987456789',
letters: 'ABCDEFG'
}
]
而不是:
[
{
numbers: '123',
letters: 'A'
},
{
numbers: '987',
letters: 'B
}
]
棘手的部分是 div 具有相同的 ID,因此我需要在 div 的数组中获取特定的 ID。
在 Python 中,我这样做了,然后使用 append
将项目添加到空列表中
myDivs = soup.select('#my-divs')[2]
numbers = myDivs('text.numbers')
labels = myDivs('text.labels')
Node.js
exports.scrapeData = async (req, res) => {
const html = await Axios.get(
"https://example.com"
);
const $ = await cheerio.load(html.data);
let tests = [];
$("#my-divs:eq(2)").each((i, elem) => {
tests.push({
numbers: $(elem).find("text.numbers").text(),
labels: $(elem).find("text.labels").text(),
});
});
console.log(tests);
html:
<div id="my-divs">
<text class="numbers">123</text>
<text class="labels">A</text>
<text class="numbers">987</text>
<text class="labels">B</text>
</div>
<div id="my-divs">
<text class="numbers">567</text>
<text class="labels">C</text>
<text class="numbers">543</text>
<text class="labels">D</text>
</div>
这种方法怎么样:查找所有 .numbers
,并且对于每个 return 一个对象,其中包含自己的 .text()
和紧随其后的 .labels
使用Cheerio 的 .next()
:
exports.scrapeData = async (req, res) => {
const html = await Axios.get("https://example.com");
const $ = await cheerio.load(html.data);
const tests = $("#my-divs:eq(2)").find(".numbers").map(function () {
return {
numbers: $(this).text().trim(),
labels: $(this).next(".labels").text().trim(),
}
}).toArray();
console.log(tests);
});
Cheerio 的 .map()
允许在上下文中使用 this
,而 Cheerio 的 .toArray()
从 Cheerio 对象中提取底层 JavaScript 数组。