我想在nodejs appplication中获取https://www.example.com/
的innerText。我尝试使用request
npm模块获取URL主体,如下所示:
function getBodyText() {
request({
url:'https://www.example.com/'
}, (error, response, body) => {
console.log(body.innerText);
});
}
上面的代码显示了我当前页面的正文(https:www.google.com)。我错过了什么吗?
答案 0 :(得分:2)
在上面的代码中,body
值只是一个字符串。另一方面,innerText
假设body
是DOM Node
。
在Node中,DOM不像在浏览器中那样存在,因此为了访问返回的DOM节点,您需要使用包Cheerio加载body
。您可以分配请求选项的transform
属性,以使用cheerio.load()
将正文加载到DOM中。然后,您可以使用传统的DOM选择器遍历body
。
要在您的请求选项对象上使用the transform
option,您需要从request
切换到request-promise
。 (npm i --save request request-promise
)它们的功能几乎完全相同,只是request-promise
将使用Bluebird返回A +承诺,其中request
使用更传统的错误第一次回调。
由于Cheerio使用自己的jQuery实现,因此在与返回的DOM交互时可以参考他们的docs。
const cheerio = require('cheerio')
const request = require('request-promise')
request({
method: 'GET',
uri: 'https://google.com'
transform: body => cheerio.load(body)
})
.then($ => {
console.log($('p').text)
})
如果您不想切换到request-promise
,您仍然可以执行此操作并使其使用Promises
const cheerio = require('cheerio')
const request = require('request')
const getDOMFromURI = uri => {
return new Promise((resolve, reject) => {
request(uri, (err, res, body) => {
if (err) {
return reject(err)
}
return resolve(cheerio.load(body))
})
})
}
getDOMFromURI('https://google.com').then($ => {
console.log($('p').text)
})
答案 1 :(得分:1)
您必须使用其他一些技术组合。您似乎想要废弃网站上的数据。请使用phantomjs或梦魇或木偶操纵者或任何其他无头浏览器。
一个小例子,为您提供如何使用puppeteer获得第一个结果标题
const puppeteer = require('puppeteer');
let scrape = async () => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('https://www.google.com.pk/search?q=puppeteer');
await page.waitFor(2000);
const result = await page.evaluate(() => {
let title = document.querySelector('h3').innerText;
return {
title
}
});
browser.close();
return result;
};
scrape().then((value) => {
console.log(value); // Success!
});
答案 2 :(得分:0)
,如果使用GET方法,可以使用字符串作为第一个参数:
request('https://www.example.com', function (error, response, body) {
console.log('error:', error); // Print the error if one occurred
console.log('statusCode:', response && response.statusCode); // Print the
response status code if a response was received
console.log('body:', body); // Print the HTML for the Google homepage.
const dom = new JSDOM(body);
console.log(dom.window.document.querySelector("p").textContent);
});
请参阅https://www.npmjs.com/package/request
您可能还想尝试request-promise模块或axios(这是用于发出HTTP请求的数字1库)
一旦你恢复了身体,你可能需要使用JSDOM或其他一些lib来将身体转换为文档对象,然后你可以使用普通的JS方法或甚至jQuery /另一个DOM遍历lib遍历