超出 Google 电子表格上的 ImportXML 限制

2024-04-03

我现在陷入了“抓取问题”。特别是我想将作者的姓名从网页提取到谷歌电子表格。其实功能=IMPORTXML(A2,"//span[@class='author vcard meta-item']")正在工作,但是当我增加了要抓取的链接数量后,它就开始无限加载。

所以我研究发现,这个问题是由于谷歌有限制造成的。

有谁知道超出限制或脚本,我可以“轻松复制”? - 我真的没有编码的预感。


我创建了一个自定义导入函数,它克服了 IMPORTXML 的所有限制。我有一张工作表,在大约 800 个单元格中使用了该函数,效果非常好。

它利用 Google Sheet 的自定义脚本(扩展 -> Apps 脚本...)并使用正则表达式而不是 xpath 搜索内容。

function importRegex(url, regexInput) {
  var output = '';
  var fetchedUrl = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText();
    if (html.length && regexInput.length) {
      output = html.match(new RegExp(regexInput, 'i'))[1];
    }
  }
  // Grace period to not overload
  Utilities.sleep(1000);
  return output;
}

然后您可以像使用任何函数一样使用此函数。

=importRegex("https://example.com", "<title>(.*)<\/title>")

当然,你也可以引用单元格。

=importRegex(A2, "<title>(.*)<\/title>")

如果您不想在输出中看到 HTML 实体,可以使用此函数。

var htmlEntities = {
  nbsp:  ' ',
  cent:  '¢',
  pound: '£',
  yen:   '¥',
  euro:  '€',
  copy:  '©',
  reg:   '®',
  lt:    '<',
  gt:    '>',
  mdash: '–',
  ndash: '-',
  quot:  '"',
  amp:   '&',
  apos:  '\''
};
 
function unescapeHTML(str) {
    return str.replace(/\&([^;]+);/g, function (entity, entityCode) {
        var match;
 
        if (entityCode in htmlEntities) {
            return htmlEntities[entityCode];
        } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
        } else if (match = entityCode.match(/^#(\d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
};

全部一起…

function importRegex(url, regexInput) {
  var output = '';
  var fetchedUrl = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText();
    if (html.length && regexInput.length) {
      output = html.match(new RegExp(regexInput, 'i'))[1];
    }
  }
  // Grace period to not overload
  Utilities.sleep(1000);
  return unescapeHTML(output);
}
 
var htmlEntities = {
  nbsp:  ' ',
  cent:  '¢',
  pound: '£',
  yen:   '¥',
  euro:  '€',
  copy:  '©',
  reg:   '®',
  lt:    '<',
  gt:    '>',
  mdash: '–',
  ndash: '-',
  quot:  '"',
  amp:   '&',
  apos:  '\''
};
 
function unescapeHTML(str) {
    return str.replace(/\&([^;]+);/g, function (entity, entityCode) {
        var match;
 
        if (entityCode in htmlEntities) {
            return htmlEntities[entityCode];
        } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
        } else if (match = entityCode.match(/^#(\d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超出 Google 电子表格上的 ImportXML 限制 的相关文章

  • 使用 JS 将 Windows-1252 转换为 UTF-8

    我有一些荷兰语的字符串 我知道如何使用 PHP 对它们进行编码 str iconv Windows 1252 UTF 8 str Javascript 中的等价物是什么 Windows 1252 是单字节编码 非常方便 您只需构建一个查找表
  • ... 不支持谷歌地图 Javascript API。使用其他浏览器

    我正在使用两个不同的第三方程序 不同的公司 它们显然使用 Google Maps Javascript API 当他们加载地图时 会显示世界地图 但会显示一条错误消息 Der von Ihnen verwendete Browser wir
  • 使用 Formik 反应验证最大范围

    我正在尝试使用 React 和 Formik 进行验证 我想要实现最大数字仅为 2 最大范围应仅为 12 expiryMonth yup string required Select month max 2 Invalid month fo
  • Protractor 中的全局 beforeEach 和 afterEach

    在每个规范中我都有beforeEach and afterEach声明 是否可以以某种方式全局添加它以避免规范之间的代码重复 目的beforeEach and afterEach 函数是添加一个重复代码块 每次开始或完成执行每个规范时都需要
  • SVG 渐变颜色

    Hi I m working with SVG here I trying to add the gradient to SVG like this 白色和灰色渐变 但我无法实现所需的输出 谁能指出我正确的方向
  • 如何在 Nuxt 3 中使用 useQuery() 作为 API 路由参数?

    我正在遵循一个指南 其中api routes是这样构建的 1 创建server api route js file export default defineEventHandler event gt return message hell
  • 这段用于确定圆和线段是否相交的代码正确吗?

    显然很难找到一条线是否存在的答案segment和圆相交 例如 如果你用谷歌搜索 你会发现这个问题 https stackoverflow com questions 1073336 circle line segment collision
  • JavaScript 中是否可以从子类导入父模块?

    我有两个带有自己模块的文件 Sub js and 父 js 父 js import Sub from Sub js export default class Parent static createSomething new Sub Sub
  • d3.event 在去抖动函数内为 null

    当尝试使用 mousemove 事件处理程序的去抖版本时 d3 event is null 我想使用d3 mouse此去抖动处理程序中的对象 但是d3 event返回 null 并抛出错误 我怎样才能访问d3 event在下面的代码中 a
  • Cordova Momentum 在 iOS 溢出元素上滚动

    在 Safari iOS 浏览器中侦听滚动事件每次都会触发控制台消息 即使是在动量上 但在 cordova 构建的应用程序中 只有当滚动停止时才会触发 el with webkit overflow scrolling touch on s
  • 在 JavaScript 中使用 Rails 变量时转义引号?

    我在尝试在 javascript 代码中使用 Rails 变量时遇到问题 例如 我可能定义一个 link to remote 带有参数 complete gt alert my var If my var I m testing 那么 ja
  • 从 JavaScript 获取变量到 Dart

    我的 HTML 文档头中导入了一个 JavaScript 库 如何从该库访问对象 谢谢 文章中描述了与 JavaScript 的互操作 使用 Dart 中的 JavaScript js 库 http www dartlang org art
  • DOMNodeRemovedFromDocument 的简单 MutationObserver 版本

    我将一些功能附加到 DOM 元素 并希望能够在从 DOM 中删除该元素时清除所有引用 以便可以对其进行垃圾收集 我检测元素删除的初始版本是这样的 var onremove function element callback var dest
  • 单击我网站上的任何链接 (a) 时如何运行 jQuery 函数

    我有一个基于 corecommerce 系统的新网站 该系统对 HTML 和 PHP 没有太多访问权限 我唯一可以使用的是 JavaScript 他们的系统目前的页面加载速度不是很好 所以我希望至少客户在等待 5 8 秒页面加载时知道发生了
  • 对象中最后一行后的尾随逗号

    我在 VS Code 中使用 Prettier 我注意到 当使用保存格式时 Prettier 每次都会在对象的最后一行添加尾随逗号 例如 假设我有一个像这样的 JS 对象 obj hello hello world world Pretti
  • JS 中相当于 PHP 函数 number_format 的是什么?

    PHP 函数 function formatNumberForDisplay number decimal 0 decimalSeperator numberSeperator return number format number dec
  • 多个异步 AJAX 调用最佳实践

    我有一个关于在单个页面上进行多个 AJAX 调用的 最佳实践 的问题 我需要异步进行 5 个独立的调用 我知道 ajax 本质上是异步的 但我很好奇是否有一种 更干净 或 更好 的方法来执行多个 AJAX 调用 下面是包含多个 AJAX 调
  • Javascript 字符串到 int 的转换

    我在页面中嵌入了以下 JS var round Math round var id this attr id var len id length var indexPos len 1 index of the number so that
  • 将带有ajax请求的数组发送到php

    我像这样创建了数组 9 ques 5 19 ques 4 现在我想将它从 JS 发送到 PHP 但我没有得到正确的结果 我的JS代码是 button click function e e preventDefault ajax type p
  • 如何在 Three.js 中从三角面获取多边形?

    我在网上查了一下是否有人遇到同样的问题 我正在使用 Three js 我有一个 3DObject 其中可能包含孔 面是三角形的 假设我想从上面看到它 我的目标是获得一个代表顶面周长的多边形 这对我来说意味着不再有三角面 而只有 1 个多边形

随机推荐