我曾经用python和beautiful soup成功地做到了这一点,但现在我尝试将其移植到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);
网页:
<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>
2条答案
按热度按时间yeotifhr1#
这个方法怎么样:查找所有
.numbers
,并使用Cheerio的.next()
为每个.numbers
返回一个包含其自身.text()
和紧随其后的.labels
的对象:Cheerio的
.map()
允许在上下文中使用this
,而Cheerio的.toArray()
从Cheerio对象中提取底层JavaScript数组。dwthyt8l2#
下面是另一种使用点差和索引配对的方法,类似于
zip
函数: