Реализация универсального веб-скребка с использованием Node.js - PullRequest
0 голосов
/ 15 января 2019

Я хотел бы реализовать базовый веб-скребок с использованием Node.js, который является настолько универсальным, насколько это возможно. Я хочу, чтобы приложение могло анализировать и возвращать текст из любого HTML-кода, игнорируя любую разметку / CSS / Script без необходимости заранее знать структуру HTML-кода.

Я искал использование этой библиотеки:

https://github.com/cheeriojs/cheerio

С помощью приведенного ниже кода я могу извлечь текст из тега body, однако он также содержит CSS и JavaScript. Как лучше всего извлечь только текст и не включать CSS / JavaScript?

Код:

 var request = require('request');
var cheerio = require('cheerio');
var URL = require('url-parse');

var pageToVisit = "http://www.arstechnica.com";
console.log("Visiting page " + pageToVisit);
request(pageToVisit, function (error, response, body) {
    if (error) {
        console.log("Error: " + error);
    }
    // Check status code (200 is HTTP OK)
    console.log("Status code: " + response.statusCode);
    if (response.statusCode === 200) {
        // Parse the document body
        var $ = cheerio.load(body);
        console.log($('body').text());
    }
});

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я считаю, что cherio.load (тело) дает вам DOM. Если это так, вы можете использовать innerText примерно так:

    // Parse the document body
    var $ = cheerio.load(body);
    console.log($('body').innerText);

Если cherio предоставляет вам HTML, вы можете преобразовать его в DOM с помощью JSDOM примерно так:

    // Parse the document body
    const jsdom = require(jsdom);
    const dom = jsdom.JSDOM(cheerio.load(body),{"url": pageToVisit}).window.document.body;
    console.log(dom.innerText);
0 голосов
/ 15 января 2019

глядя на другие ответы, которые я видел, что вы можете использовать регулярные выражения для этого, вот пример:

let scriptRegex = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
let styleRegex = /((<style>)|(<style type=.+))((\s+)|(\S+)|(\r+)|(\n+))(.+)((\s+)|(\S+)|(\r+)|(\n+))(<\/style>)/g;

// An example html content
const str = `
my cool html content
<style>
...
</style>
my cool html content
<style type="text/css">
...
</style>
my cool html content
<script> 
... 
</script>
my cool html content`;

// Strip the tags from the html
let result = str.replace(scriptRegex, '');
result = result.replace(styleRegex, '');

// There you go :)
console.log('Substitution result: ', result);

Надеюсь, это поможет!

...