为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Node JS 从 URL 中提取表值

使用 Node JS 从 URL 中提取表值

犯罪嫌疑人X 2021-12-23 15:56:14
我对 Node JS 和 express 很陌生,但我正在尝试构建一个提供静态文件的网站。经过一些研究,我发现 NodeJS 和 Express 在这方面非常有用。到目前为止,我设法提供了一些位于我的服务器上的静态 html 文件,但现在我想做其他事情:我有一个 html 页面的 URL,在那个 html 页面中,有一个包含一些信息的表格。我想从中提取特定的几个值,并且 1) 将其作为 JSON 保存在文件中,2) 将这些值写入 html 页面。我曾尝试使用 jQuery,但到目前为止我一直没有成功。这是我到目前为止:1.node 应用程序在端口 8081 上运行,我将使用 NGINX 反向代理从任何地方进一步访问它(我已经安装了 nginx 并且可以正常工作)2.当我使用正确的 URI 时,我可以获得 URL 并将其作为 HTML 提供。3.我看到该表没有ID,只有与之关联的“详细信息”类。另外,我只对获取这些行感兴趣:<div class='group'><table class='details'><tr><th>Status:</th><td>With editors</td></tr>从我目前看到的情况来看,如果表有一个 ID,jQuery 就可以正常工作。这是我的代码 app.jsvar express = require('express');var app = express();var request = require('request');const path = require('path');var content;app.use('/', function(req, res, next) {  var status = 'It works';  console.log('This is very %s', status);  //console.log(content);  next();});request(  {    uri:      'https://authors.aps.org/Submissions/status?utf8=%E2%9C%93&accode=CH10674&author=Poenaru&commit=Submit'  },  function(error, response, body) {    content = body;  });app.get('/', function(req, res) {  console.log('Got a GET request for the homepage');  res.sendFile(path.join(__dirname, '/', 'index.html'));});app.get('/url', function(req, res) {  console.log('You requested table data!!!');TO DO:   SHOW ONLY THE THE VALUES OF THAT TABLE INSTEAD OF THE WHOLE HTML PAGE  res.send(content);});var server = app.listen(8081, function() {  var host = server.address().address;  var port = server.address().port;  console.log('Node-App listening at http://%s:%s', host, port);});基本上,该 URL 的 HTML 内容保存到content变量中,现在我只想保存其中的表格,并且只将保存的部分输出到新的 html 页面。有任何想法吗?先感谢您 :)
查看完整描述

2 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

好的,所以我遇到了这个名为cheerio的包,它基本上允许在服务器上使用jQuery。有了来自该特定 URL 的 html 代码,我可以在该表中搜索我需要的元素。Cheerio 非常简单,通过这段代码,我得到了我需要的结果:


var cheerio = require('cheerio');

request(

  'https://authors.aps.org/Submissions/status?utf8=%E2%9C%93&accode=CH10674&author=Poenaru&commit=Submit',

  (error, res, html) => {

    if (!error && res.statusCode === 200) {

      const $ = cheerio.load(html);

      const details = $('.details');

      const articleInfo = details.find('th').eq(0);

      const articleStatus = details

        .find('th')

        .next()

        .eq(0);

      //console.log(details.html());

      console.log(articleInfo.html());

      console.log(articleStatus.html());

    }

  }

);


干杯!


查看完整回答
反对 回复 2021-12-23
?
PIPIONE

TA贡献1829条经验 获得超9个赞

您的任务称为“抓取”。您想从某个并非您创建的网页中抓取特定的数据块,然后将其作为您自己网页的一部分返回。


您已经注意到抓取的一个问题:通常您抓取的页面没有使用独特的id. 所以你必须使用一些猜测来找到它。@AvcS 指出了一个名为jsdom的服务器端 npm 库,您可以用于此目的。


请注意:尽管浏览器和 nodejs 都使用 Javascript,但它们仍然是非常不同的环境。浏览器 Javascript 有许多内置 API 来访问网页的文档对象模型 (DOM)。但是 nodejs 没有这些 API。如果您尝试将 jQuery 加载到 node.js 中,它将无法工作,因为它依赖于浏览器 DOM API。jsdom 包为您提供了其中一些 DOM API。


一旦您获取了要抓取的网页,这样的代码可能会帮助您获得所需的内容。


const jsdom = require("jsdom");

const { JSDOM } = jsdom;

...

const page = new JSDOM(page_in_text_string).window;

然后,您可以使用 DOM API 的子集来查找页面中所需的元素。在您的示例中,您正在寻找带有选择器的元素div.class table.group。您正在寻找div.class元素。


你可以做这样的事情来找到你需要的东西:


const desiredTbl = page.document.querySelector("div.class table.group");

const desiredDiv = desiredTbl ? desiredTbl.parentNode : null;

const result = desiredDiv ? desiredDiv.textContent : null;

最后这样做:


page.close();

您的问题说您需要文档中的某些行。HTML 文档没有行,它们有元素。如果您只想提取元素的一部分(表格的一部分而不是整个内容),则需要使用一些文本字符串代码。只是在说'


此外,我还没有调试任何这些。那是留给你的。


有一个更小更快的库可以做类似的事情,称为node-html-parser。如果性能很重要,您可能想要那个。


查看完整回答
反对 回复 2021-12-23
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信