当我上传 html 文件时,Cheerio 不起作用

Cheerio Doesn't work when I upload an html file

我正在使用以下在 nodejs 中实现 express 的函数。我还使用 cheerio 库进行一些网络抓取。下面的函数工作得很好,但这并不是我想要的。我不想像这样传递 URL,而是想直接上传文件。

 router.post('/transcript', async (req,res)=>{
  
  
  const result = await request.get("https://www.codingwithstefan.com/table-example/");
  const $ = cheerio.load(result);
  $("body > table > tbody > tr > td").each((index, element) => {
    console.log($(element).text());
  });
  
});

我 运行 遇到了 cheerio 的多个问题,我决定在我的通话中使用 URL 来测试它。该网站只是 table 而已。现在我实际上想要做的是相同的,但我不想像这样传递 URL,而是想直接上传我的 HTML 文件。我只是通过右键单击页面并另存为来保存网站。我只是将网页的 HTML 文件保存在我的桌面上(它被命名为 b.html)。现在我正在实现相同的功能,但我没有像这样传递 URL,而是使用以下 curl 命令 curl -d "@C:/Users/yehya/Desktop/b.html" http://localhost:5000/api/transcript 将 HTML 文件作为请求传递。函数几乎完全相同,但是 URL 取而代之的是 cheerio.load() 接受了 req.body。遗憾的是,这不起作用,我不明白为什么。这个电话从来没有 returns 任何东西,我也尝试过玩弄它但是要么得到 null 要么 undefined 。我不明白为什么这个完全相同的东西不起作用。我猜当我像这样上传 HTML 文件时会发生一些变化,但我无法弄清楚这里的问题。我已经盯着我的屏幕好几天了,谢谢帮助。

router.post('/transcript', async (req,res)=>{
  
  
  const $ = cheerio.load(req.body);
  $("body > table > tbody > tr > td").each((index, element) => {
    console.log($(element).text());
  });
  
});

好的,您在代码中做错了几件事。这是一个列表:

  1. 您的代码没有用于处理文件上传的中间件。所以这意味着您没有按预期传递 HTML 文件的内容。传递了一个空字符串,因此它不会生成 table 单元格的内容。
  2. 您的 curl 请求有误。对于文件上传,您需要使用 -F 标志。

这是我用您的代码和源文件测试的完整工作片段:

index.js

const express = require('express');
const bodyParser = require('body-parser');
const cheerio = require('cheerio');
const multer = require('multer');

const uploader = multer();
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post('/', uploader.single('src'), async (req, res, nxt) => {
    const src = req.file;
    const content = src.buffer.toString('utf8');
    const $ = cheerio.load(content);
    $("body > table > tbody > tr > td").each((index, element) => {
        console.log($(element).text());
    });
    //console.log(root);
    res.json({ status: 200 });
});

app.listen(3000, () => {
    console.log('App started');
});

您需要安装 multerbody-parser 才能使其正常工作(它可能在没有正文解析器的情况下工作,但处理其他 POST 请求时需要它)。您可以像这样安装它们:npm i --save multer body-parser。在他们的 npm/github 页面上阅读更多关于 multer 和 body-parser 的内容。

其次,要上传文件,curl请求应该是这样的:

curl -X POST -F 'src=@/path/to/src-file.html' http://localhost:3000/

注意一件事:传递给 uploader 中间件的名称 srccurl.

上传文件时使用的名称相同