Извлечение табличного значения из URL с помощью Node JS - PullRequest
0 голосов
/ 11 ноября 2019

Я новичок в Node JS и выражаю, но я пытаюсь создать сайт, который обслуживает статические файлы. После некоторых исследований я обнаружил, что NodeJS с Express может быть весьма полезным для этого. До сих пор мне удавалось обслуживать некоторые статические html-файлы, которые находятся на моем сервере, но теперь я хочу сделать что-то еще: у меня есть URL-адрес html-страницы, и на этой html-странице есть таблица с некоторой информацией.

Я хочу извлечь из него определенную пару значений, и 1) сохранить его как JSON в файле, 2) записать эти значения в HTML-страницу. Я пытался поиграть с jQuery, но пока что безуспешно.

Это то, что у меня есть:

1.узел приложения, работающий на порту 8081, который я буду использоватьдальнейший доступ к нему из любой точки мира с помощью обратного прокси-сервера NGINX (у меня уже есть настройка nginx, и она работает)

2. Я могу получить URL-адрес и использовать его в качестве HTML при использовании правильного URI.

3. Я вижу, что у таблицы нет идентификатора, а только связанный с ней класс «details». Кроме того, меня интересует только получение этих строк:

<div class='group'>
<table class='details'>
<tr>
<th>Status:</th>
<td>
With editors
</td>
</tr>

Из того, что я видел до сих пор, 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);
});

По сути, содержимое HTML этого URL-адреса сохраняется в переменной content, и теперь я хотел бы сохранить только таблицу из нее, а также вывести только сохраненную часть вНовая HTML-страница.

Есть идеи? Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Хорошо, я наткнулся на пакет под названием cheerio , который в основном позволяет использовать jQuery на сервере. Имея HTML-код с этого конкретного URL, я мог бы искать в этой таблице элементы, которые мне нужны. 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, за то, что указали мне jsdon и html-node-parser. Я обязательно поиграю с такими в ближайшем будущем:)

Ура!

0 голосов
/ 11 ноября 2019

Ваша задача называется "выскабливание". Вы хотите собрать определенную порцию данных с какой-то веб-страницы, которую вы не создали, а затем вернуть ее как часть своей собственной веб-страницы.

Вы заметили проблему с очисткой: часто страница, которую вы очищаетене идентифицирует данные, которые вы хотите, с отличительным id. Таким образом, вы должны использовать некоторые догадки, чтобы найти его. @AvcS указал на библиотеку npm на стороне сервера, которая называется jsdom , которую вы можете использовать для этой цели.

Обратите внимание: несмотря на то, что браузеры и nodejs используют Javascript, они все еще очень разные среды. Браузер Javascript имеет множество встроенных API для доступа к веб-страницам объектных моделей документов (DOM). Но у nodejs нет этих API. Если вы попытаетесь загрузить jQuery в node.js, он не будет работать, потому что это зависит от API DOM браузера. Пакет jsdom предоставляет вам некоторые из этих API-интерфейсов DOM.

После того, как вы загрузили эту веб-страницу для очистки, такой код может помочь вам получить то, что вам нужно.

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 . Если производительность важна, вы можете захотеть этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...