使用Node JS从URL提取表值

我对Node JS并不陌生,但我正在尝试建立一个提供静态文件的网站。经过一些研究,我发现带有Express的NodeJS对此非常有用。 到目前为止,我设法提供了一些位于服务器上的静态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('/',res) {
  console.log('Got a GET request for the homepage');
  res.sendFile(path.join(__dirname,'/','index.html'));
});

app.get('/url',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页面。

有什么想法吗? 预先谢谢你:)

wydly443 回答:使用Node JS从URL提取表值

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

您已经注意到抓取存在问题:通常,您要抓取的页面无法使用独特的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。如果性能很重要,那么您可能需要那个。

,

好,所以我遇到了一个名为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());
    }
  }
);

感谢@ O.Jones和@avcS引导我进入jsdonhtml-node-parser。我一定会在不久的将来和那些玩的:)

干杯!

本文链接:https://www.f2er.com/3124531.html

大家都在问