如何从URL的主体获取innertext

时间:2018-01-19 18:30:13

标签: javascript html node.js httprequest

我想在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)。我错过了什么吗?

3 个答案:

答案 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遍历