在 Google 表格中使用 IMPORTXML 从 Google 支持页面中提取元素时遇到问题

Trouble Extracting Elements from Google Support Pages Using IMPORTXML in Google Sheets

提问人:ali izadi 提问时间:11/15/2023 更新时间:11/15/2023 访问量:37

问:

我正在尝试使用 Google 表格中的 IMPORTXML 函数从特定的 Google 支持页面中提取元素。该公式适用于其他 URL,但是当我在 Google 支持页面上使用它时,它会返回 Could not fetch url 错误:

=IMPORTXML("https://support.google.com/looker-studio/answer/11521624?hl=en", "//h2")

  • 标题肯定存在于页面上。
  • 该页面不需要登录,并且可以公开访问。
  • IMPORTXML 函数可成功与其他非 Google 网站配合使用。
  • 我更愿意使用IMPORTXML本身来解决此问题,而不是Google Apps Script或手动复制等其他方法。

这是 IMPORTXML 对 Google 自己的网页的特定限制吗?是否有任何已知的解决方法或对 IMPORTXML 查询的特定调整可能会绕过此问题,同时仍在使用 IMPORTXML?

google-sheets 网页抓取 google-sheets-formula

评论


答:

1赞 Kevin P. 11/15/2023 #1

存在一些限制。IMPORTXML

IMPORTXML只能从任何各种结构化数据类型(包括 XML、HTML、CSV、TSV 以及 RSS 和 ATOM XML 源)导入数据。

您尝试导入的数据似乎是由 JavaScript 动态加载或格式错误的,因此 IMPORTXML 无法检索它。

评论更新:

如果您对脚本持开放态度,通常总会有另一种选择。有很多关于获取和网络抓取的例子。例如,您可以使用以下脚本提取指定 URL 处标记之间的所有内容,并返回一个数组。

只需导航到“扩展”>“应用脚本”,将其发布到 Code.gs 文件中,然后单击“保存”。

function fetchAllH2Text(url) {
  const html = UrlFetchApp.fetch(url).getContentText();

  // Use regular expression to match content between <h2> tags
  const h2Matches = html.match(/<h2[^>]*>([\s\S]*?)<\/h2>/g);

  if (h2Matches) {
    // Extract text content from the matches
    const h2TextArray = h2Matches.map(match => match.replace(/<\/?h2[^>]*>/g, '').trim());
    return h2TextArray;
  } else {
    return ["No <h2> tags found"];
  }
}

这将允许您使用如下所示的自定义函数:

=fetchAllH2Text("https://support.google.com/looker-studio/answer/11521624?hl=en")

由于 URL 没有格式良好的 XML,这是一开始不起作用的原因,我们使用正则表达式来提取标签之间的文本。这会导致某些内容仍包含在该标记内的标记中。从这里,您可以使用标准公式来清理您要查找的内容。IMPORTXML

example

更新2:

或者,如果您想通过正则表达式清理数据,您可以使用此脚本,该脚本将仅从匹配项中返回长日期。

function fetchDatesFromH2Tags(url) {
  const html = UrlFetchApp.fetch(url).getContentText();

  // Use regular expression to match content between <h2> tags
  const h2Matches = html.match(/<h2[^>]*>(?:<a[^>]*>.*?<\/a>)?(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4}<\/h2>/gi);

  if (h2Matches) {
    // Extract text content from the matches
    const h2TextArray = h2Matches.map(match => match.replace(/<\/?h2[^>]*>|<a[^>]*>|<\/a>/g, '').trim());
    return h2TextArray;
  } else {
    return ["No <h2> tags found"];
  }
}

请务必使用新的函数名称=fetchDatesFromH2Tags("https://support.google.com/looker-studio/answer/11521624?hl=en")

评论

0赞 ali izadi 11/15/2023
谢谢,您知道任何可以帮助我导入此数据的替代方法吗?
1赞 Kevin P. 11/15/2023
看看更新。不幸的是,我不知道在不使用脚本帮助的情况下您可以做任何事情,因为内容不是格式正确的 XML。