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
的情况。
为此,我正在按照 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
的情况。