我现在正在关注https://codeburst.io/a-guide-to-automating-scraping-the-web-with-javascript-chrome-puppeteer-node-js-b18efb9e9921中的教程,以了解有关使用puppeteer抓取网站的更多信息。他/她为此使用了网站http://books.toscrape.com/。遵循本教程后我们得到的代码是
const puppeteer = require('puppeteer');
let scrape = async () => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('http://books.toscrape.com/');
await page.click('#default > div > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > div.image_container > a > img');
await page.waitFor(1000);
const result = await page.evaluate(() => {
let title = document.querySelector('h1').innerText;
let price = document.querySelector('.price_color').innerText;
return {
title,
price
}
});
browser.close();
return result;
};
scrape().then((value) => {
console.log(value); // Success!
});
运行此代码后的输出是
{ title: 'A Light in the Attic', price: '£51.77' }
我理解所有这一切,但我想再往前走一点。也就是说,我想提取51.77的价格,并进一步使用这个价格在同一个脚本中用它做一些计算。我尝试了以下但是失败了
scrape().then((value) => {
const str=value;
const fl=parseFloat(str.substring(42,46));
fl=2*fl;
console.log('result is',fl);
});
我想我不完全理解innerText函数是如何工作的以及它实际输出的内容。
答案 0 :(得分:1)
我认为你应该用这种方式解析价格值,它应该有效
scrape().then((value) => {
const str = value;
const fl = parseFloat(str.price);
fl=2*fl;
console.log('result is',fl);
});
答案 1 :(得分:1)
computed: {
isProcessing: function () {
return this.products.find( product => product.status === 'processing' ) !== undefined
}
}
value是从scrape()返回的结果,因此值和对象一样
scrape().then((value) => {
const str=value;
let fl=parseFloat(str.substring(42,46));
fl=2*fl;
console.log('result is',fl);
});
访问您必须使用的价格'。' 你的代码应该是这样的:
value:{ title: 'A Light in the Attic', price: '£51.77' }
答案 2 :(得分:1)
您的value
不是字符串,而是具有标题和价格属性的对象。因此,您可以通过value.price
访问价格。
或者,您可以通过解构将参数写为{title, price}
而不是value
。
此外,如果您希望稍后重新指定其他值,则无法将fl
声明为常量。
从价格中删除货币符号和可能的其他非数字符号的有效方法是通过正则表达式匹配:
scrape().then(({title, price}) => {
let fl = +price.match(/\d+.\d+/)[0];
fl = 2 * fl;
console.log('result is', fl);
});
根据您的需要,如果没有有效价格,您可能仍希望在price.match
返回null
时处理此案例。