【问题标题】:How Do I Use IMPORTXML For Hundreds of URL's?如何将 IMPORTXML 用于数百个 URL?
【发布时间】:2023-03-24 12:15:01
【问题描述】:
基本上我有一排 300 多个 URL。
我需要提取下一列中每个 URL 旁边的标题。
所以我尝试了这个:
=IMPORTXML(A1,"//title")
并将它拖到 A300+ - 它可以工作,问题是它调用了太多的东西,谷歌告诉我,我等到最后 2 个,然后意外刷新页面,又重新开始。
我也试过了:
={IMPORTXML(A1,"//title");IMPORTXML(A327,"//title")}
正如其他人建议的那样,它仍在加载(同样的问题)。
有没有更好的方法来做到这一点?
【问题讨论】:
标签:
google-sheets
google-sheets-formula
spreadsheet
【解决方案1】:
很遗憾,IMPORTXML does not support ARRAYFORMULA。此外,当有数百个包含 IMPORTXML 函数的单元格时,由于会有多个 IMPORTXML 请求,因此该函数的结果可能会重新加载。
替代选项:
您可以在电子表格文件中通过creating a bound script(见下文)尝试此示例,该文件将为您提供自定义菜单:
此脚本将使用UrlFetchApp 代替 IMPORTXML 函数来获取 URL 的标题。
示例脚本:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('URL titles')
.addItem('Show URL titles on Column B', 'processTitles')
.addToUi();
}
function processTitles(){
var ss = SpreadsheetApp.getActive().getActiveSheet();
var lastRow = ss.getDataRange().getLastRow();
var url;
for(row=1; row<= lastRow; row++){ //Script will start getting URL from A1 and beyond
if(ss.getRange("B"+row).getValue() == ""){
try{
url = ss.getRange("A"+row).getValue();
var response = UrlFetchApp.fetch(url).getContentText();
ss.getRange("B"+row).setValue(response.match('<title>(.*?)</title>')[1])
Logger.log(response.match('<title>(.*?)</title>')[1].toString());
continue;
}catch(e){
ss.getRange("B"+row).setValue(response.match('title="(.*?)"')[1]);
Logger.log(response.match('title="(.*?)"')[1].toString());
continue;
}
}else{
continue;
}
}
}
自定义菜单在 B 列显示 URL 标题 将自动
通过读取 URL 的 HTML 内容来抓取 URL 标题,并将使用 match() 方法查找 <title></title> 标签或 title=""。我已使用https://stackoverflow.com/a/12030612 的答案作为参考。
样本结果:
A 列带有 URL 的示例工作表文件:
从编辑器运行脚本后,返回电子表格文件并单击自定义菜单Show URL titles on Column B
这是运行自定义菜单后的结果: