Ошибка в строке 1: содержание не разрешено в прологе - PullRequest
0 голосов
/ 31 октября 2018

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

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 голосов
/ 01 ноября 2018

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

Очки модификации:

  • В этом случае требуется изменить полученные значения 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-адреса, измените скрипт.

Справка:

Если это не то, что вы хотите, извините.

...