Могу ли я загрузить локальный HTML-файл с пакетом cheerio в node.js?

У меня есть несколько html-файлов на жестком диске, из которых я хотел бы использовать jquery для извлечения данных. Возможно ли это сделать с помощью Cheerio? Я пытался дать Cheerio локальный путь, но он не работает. Одна из идей, которые у меня были, заключалась в том, чтобы создать веб-сервер в узле, прочитать из html-файла, а затем передать его на cheerio через сервер - будет ли это


person Jpaji Rajnish    schedule 18.12.2013    source источник


Ответы (3)


Ввод представляет собой строку html, поэтому вам нужно самостоятельно прочитать содержимое html:

var fs = require('fs');

cheerio.load(fs.readFileSync('path/to/file.html'));
person damphat    schedule 18.12.2013
comment
Это должно быть добавлено в документацию - person forloop; 28.03.2016
comment
как мне заставить это работать с относительным путем в каталоге моего проекта? это не сработало для меня. - person lopezdp; 03.11.2019

HTML-файл можно прочитать асинхронно с помощью функции readFile из модуля fs. По окончании чтения файла функции обратного вызова передаются два аргумента (err, data).

Полученный data содержит html-контент и может быть просто передан функции cheerio load.

var cheerio = require('cheerio');
var fs = require('fs'); 

fs.readFile('path/to/file.html', 'utf8', function(err, data) {

    if (err) throw err;

    var $ = cheerio.load(data);
    console.log($.html());
});

Примечание: поскольку кодировка utf8 указана в качестве необязательного второго аргумента, данные typeof представляют собой строку. Если кодировка опущена, данные будут буфером. Тем не менее, функция загрузки понимает это, потому что буфер внутренне преобразуется в строку с:

if (Buffer.isBuffer(content))
  content = content.toString();

Документация по fs.readFile()

person Tobi Obeck    schedule 12.12.2018

Расширение ответа damphat, чтобы он работал для относительных путей:

import fs from 'fs';
import path from 'path';

const filePath = path.join(__dirname, './path/to/file.html');
const $ = cheerio.load(fs.readFileSync(filePath));

person rehman_00001    schedule 06.08.2020