是否有一种改进的方法,通过indexOf从搜索位置文本分离子字符串?



我使用的方法是在搜索文本各部分(const Beforeconst After)的位置时需要将+13-1放入计算中,是否有更可靠和正确的方法?

const PositionBefore = TextScript.indexOf(Before)+13;
const PositionAfter = TextScript.indexOf(After)-1;

我担心的是,由于某种原因,搜索文本发生了变化,而我忘记更改计算的数字,这会导致检索到的文本出现错误。

我返回的文本部分是日期和时间:

2021-08-31 19:12:08
function Clock() {
var sheet = SpreadsheetApp.getActive().getSheetByName('Clock');
var url = 'https://int.soccerway.com/';

const contentText = UrlFetchApp.fetch(url).getContentText();
const $ = Cheerio.load(contentText);

const Before = '"timestamp":"';
const After = '});n    block.registerForCallbacks();';

var ElementSelect = $('script:contains(' + Before + ')');
var TextScript = ElementSelect.html().replace("n","");

const PositionBefore = TextScript.indexOf(Before)+13;
const PositionAfter = TextScript.indexOf(After)-1;

sheet.getRange(1, 1).setValue(TextScript.substring(PositionBefore, PositionAfter));
}

示例全文收集于var TextScript:

(function() {
var block = new HomeMatchesBlock('block_home_matches_31', 'block_home_matches', {"block_service_id":"home_index_block_homematches","date":"2021-08-31","display":"all","timestamp":"2021-08-31 19:12:08"});
block.registerForCallbacks();

$('block_home_matches_31_1_1').observe('click', function() { block.filterContent({"display":"all"}); }.bind(block));
$('block_home_matches_31_1_2').observe('click', function() { block.filterContent({"display":"now_playing"}); }.bind(block));

block.setAttribute('colspan_left', 2);
block.setAttribute('colspan_right', 2);

TimestampFormatter.format('block_home_matches_31');
})();

没有办法消除对源内容进行结构更改的风险。

您可以采取一些步骤来尽量减少忘记更改代码的可能性—例如,通过删除硬编码+13-1的需要。除此之外,还可能有其他原因导致代码失败。

当你的代码失败时,让它非常明显可能更重要。

考虑以下示例(为简单起见,不使用Cheerio):

function demoHandler() {
var url = 'https://int.soccerway.com/';
const contentText = UrlFetchApp.fetch(url).getContentText();
var matchedJsonString = contentText.match(/{.*?"timestamp".*?}/)[0];
if ( matchedJsonString ) {
try {
var json = JSON.parse(matchedJsonString);
} catch(err) {
console.log( err ); // "SyntaxError..."
}
console.log(json.timestamp)
} else {
consle.log( 'Something went terribly wrong...' )
}
}

当你运行上面的函数时,它将打印以下内容到控制台:

2021-08-31 23:18:46

它假设"timestamp"的键值是JSON字符串的一部分,以{开始,以}结束。

因此,您可以提取这个JSON字符串并将其转换为JavaScript对象,然后直接访问时间戳值,而无需处理子字符串。

如果JSON是无效的,你会得到一个显式的错误,类似于:

[SyntaxError: Unexpected token c in JSON at position 0]
抓取网页数据几乎总是有这些类型的风险:如果源结构在没有警告的情况下发生变化,你的代码可能很脆弱,很容易被破坏。试着让这些改变尽可能地引人注目。在你的情况下,把错误写在你的电子表格中,并让它非常明显(红色,粗体等)。

并充分利用try...catch语句。看到:try…catch

最新更新