Node js中innertext的结果

result of innertext in Node js

为此,我正在按照 https://codeburst.io/a-guide-to-automating-scraping-the-web-with-javascript-chrome-puppeteer-node-js-b18efb9e9921 to learn more about scraping website using puppeteer. He/she uses the website 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 函数的工作原理以及它真正输出的内容。

我认为你应该以这种方式解析价格值,它应该有效

scrape().then((value) => {
const str = value;
const fl = parseFloat(str.price);
fl=2*fl;
console.log('result is',fl);
});
scrape().then((value) => {
const str=value;
let fl=parseFloat(str.substring(42,46));
fl=2*fl;
console.log('result is',fl);
});

value 是从 scrape() 返回的结果,所以 value 是这样的对象

value:{ title: 'A Light in the Attic', price: '£51.77' }

要访问您必须使用“.”的价格 你的代码应该是这样的:

scrape().then((value) => {
const str=value.price
let fl=parseFloat(str.slice(1));// slice to remove the first character
fl=2*fl;
console.log('result is',fl);
});

您的 value 不是字符串,而是带有标题和价格 属性 的 object。因此,您可以通过 value.price.

访问价格

或者,您可以通过解构将参数写成 {title, price} 而不是 value

此外,如果您希望稍后重新分配另一个值,则不能将 fl 声明为常量。

从价格中删除货币符号和其他 non-numeric 符号的可靠方法是通过正则表达式匹配:

scrape().then(({title, price}) => {
  let fl = +price.match(/\d+.\d+/)[0];
  fl = 2 * fl;
  console.log('result is', fl);
});

根据您的需要,如果没有有效价格,您可能仍希望处理 price.match returns null 的情况。