Ошибка в строке 1: в прологе запрещено содержимое

Я пытаюсь очистить таблицу ценовых данных от этого Веб-сайт, используя следующий код;

function scrapeData() {
// Retrieve table as a string using Parser.
var url = "https://stooq.com/q/d/?s=barc.uk&i=d";

var fromText = '<td align="center" id="t03">';
var toText = '</td>';
var content = UrlFetchApp.fetch(url).getContentText();
var scraped = Parser.data(content).from(fromText).to(toText).build();

//Parse table using XmlService.
var root = XmlService.parse(scraped).getRootElement();
}

Я взял этот метод из подхода, который использовал в аналогичном вопросе здесь, однако он не работает на этом конкретном URL-адресе и дает мне ошибку;

Error on line 1: Content is not allowed in prolog. (line 12, file "Stooq")

В связанных вопросах здесь и здесь говорится о текстовом контенте, который не принимается к отправке анализатору, однако я не могу применить решения этих вопросов к моей собственной проблеме. Любая помощь приветствуется.

1
0
673
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как насчет этой модификации?

Пункты модификации:

  • В этом случае необходимо изменить полученные значения HTML. Например, при запуске var content = UrlFetchApp.fetch(url).getContentText() значения каждого атрибута не включаются. Их необходимо изменить.
  • В заголовке есть объединенный столбец.

Когда вышеупомянутые пункты отражаются в сценарии, он становится следующим.

Измененный скрипт:

function scrapeData() {
  // Retrieve table as a string using Parser.
  var url = "https://stooq.com/q/d/?s=barc.uk&i=d";
  var fromText = '#d9d9d9}</style>';
  var toText = '<table';
  var content = UrlFetchApp.fetch(url).getContentText();
  var scraped = Parser.data(content).from(fromText).to(toText).build();

  // Modify values
  scraped = scraped.replace(/=([a-zA-Z0-9\%-:]+)/g, "=\"$1\"").replace(/nowrap/g, "");

  // Parse table using XmlService.
  var root = XmlService.parse(scraped).getRootElement();

  // Retrieve header and modify it.
  var headerTr = root.getChild("thead").getChildren();
  var res = headerTr.map(function(e) {return e.getChildren().map(function(f) {return f.getValue()})});
  res[0].splice(7, 0, "Change");

  // Retrieve values.
  var valuesTr = root.getChild("tbody").getChildren();
  var values = valuesTr.map(function(e) {return e.getChildren().map(function(f) {return f.getValue()})});
  Array.prototype.push.apply(res, values);

  // Put the result to the active spreadsheet.
  var ss = SpreadsheetApp.getActiveSheet();
  ss.getRange(1, 1, res.length, res[0].length).setValues(res);
}

Примечание:

  • Перед запуском этого измененного сценария установите библиотеку GAS Parser.
  • Этот измененный сценарий не соответствует другому URL-адресу. Это можно использовать для URL-адреса в вашем вопросе. Если вы хотите получить значения из другого URL-адреса, измените скрипт.

Ссылка:

Если это было не то, что вам нужно, извините.

Еще раз спасибо Танаике именно то, что я искал. Вы можете объяснить, для чего в этой ситуации используется функция .replace? Также как вы определились с местоположениями «от текста» и «к тексту» в html?

redbaron1981 01.11.2018 09:06

@ redbaron1981 Спасибо за ответ. Я рад, что ваша проблема решена. Для вашего комментария: 1. Например, изменив scraped = scraped.replace(/=([a-zA-Z0-9\%-:]+)/g, "=\"$1\"").replace(/nowrap/g, "") на scraped = scraped.replace(/=([a-zA-Z0-9\%-:]+)/g, "=\"$1\"") и scraped = scraped, вы можете увидеть разницу с replace() и без него. 2. Я получил from и to из content из var content = UrlFetchApp.fetch(url).getContentText().

Tanaike 01.11.2018 23:02

Другие вопросы по теме