Я пытаюсь очистить таблицу ценовых данных от этого Веб-сайт, используя следующий код;
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")
В связанных вопросах здесь и здесь говорится о текстовом контенте, который не принимается к отправке анализатору, однако я не могу применить решения этих вопросов к моей собственной проблеме. Любая помощь приветствуется.
Как насчет этой модификации?
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);
}
Если это было не то, что вам нужно, извините.
@ 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()
.
Еще раз спасибо Танаике именно то, что я искал. Вы можете объяснить, для чего в этой ситуации используется функция .replace? Также как вы определились с местоположениями «от текста» и «к тексту» в html?