当我上传 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());
});
});
好的,您在代码中做错了几件事。这是一个列表:
- 您的代码没有用于处理文件上传的中间件。所以这意味着您没有按预期传递 HTML 文件的内容。传递了一个空字符串,因此它不会生成 table 单元格的内容。
- 您的 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');
});
您需要安装 multer
和 body-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
中间件的名称 src
与 curl
.
上传文件时使用的名称相同
我正在使用以下在 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());
});
});
好的,您在代码中做错了几件事。这是一个列表:
- 您的代码没有用于处理文件上传的中间件。所以这意味着您没有按预期传递 HTML 文件的内容。传递了一个空字符串,因此它不会生成 table 单元格的内容。
- 您的 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');
});
您需要安装 multer
和 body-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
中间件的名称 src
与 curl
.