问题描述
我用 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
,并针对每个 .text()
,使用 Cheerio 的 .labels
返回一个包含其自己的 .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);
});
的对象:
.map()
Cheerio 的 this
允许在上下文中使用 .toArray()
,而 Cheerio 的 react-d3-tree
从 Cheerio 对象中提取底层 JavaScript 数组。