猿问

使用 Node JS 从 URL 中提取表值

我对 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.js



var 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 页面。


有任何想法吗?先感谢您 :)


犯罪嫌疑人X
浏览 136回答 2
2回答

回首忆惘然

好的,所以我遇到了这个名为cheerio的包,它基本上允许在服务器上使用jQuery。有了来自该特定 URL 的 html 代码,我可以在该表中搜索我需要的元素。Cheerio 非常简单,通过这段代码,我得到了我需要的结果:var cheerio = require('cheerio');request(&nbsp; 'https://authors.aps.org/Submissions/status?utf8=%E2%9C%93&accode=CH10674&author=Poenaru&commit=Submit',&nbsp; (error, res, html) => {&nbsp; &nbsp; if (!error && res.statusCode === 200) {&nbsp; &nbsp; &nbsp; const $ = cheerio.load(html);&nbsp; &nbsp; &nbsp; const details = $('.details');&nbsp; &nbsp; &nbsp; const articleInfo = details.find('th').eq(0);&nbsp; &nbsp; &nbsp; const articleStatus = details&nbsp; &nbsp; &nbsp; &nbsp; .find('th')&nbsp; &nbsp; &nbsp; &nbsp; .next()&nbsp; &nbsp; &nbsp; &nbsp; .eq(0);&nbsp; &nbsp; &nbsp; //console.log(details.html());&nbsp; &nbsp; &nbsp; console.log(articleInfo.html());&nbsp; &nbsp; &nbsp; console.log(articleStatus.html());&nbsp; &nbsp; }&nbsp; });干杯!

PIPIONE

您的任务称为“抓取”。您想从某个并非您创建的网页中抓取特定的数据块,然后将其作为您自己网页的一部分返回。您已经注意到抓取的一个问题:通常您抓取的页面没有使用独特的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。如果性能很重要,您可能想要那个。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答