【问题标题】:Google Spreadsheets ImportXML / XPath - Image broken outputGoogle 电子表格 ImportXML / XPath - 图像损坏的输出
【发布时间】:2020-12-18 21:33:55
【问题描述】:

我正在尝试使用 XPath 通过 Google 表格中的 ImportXML 函数抓取我网站的图像。该功能似乎有效,但输出似乎被破坏了。我收到以下损坏的输出,而不是获取图像的 URL:

data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 
520 390"%3E%3C/svg%3E

我正在使用以下 XPath:

//div[contains(@class,'MuiGrid-root-59 jss358 MuiGrid-item-61')]//img/@src

我尝试了几件事,但我现在有点卡住了。有谁知道如何处理(和解决)这个编码错误?

编辑 I:特此链接到 Google 表格:example image broken in Google Sheets

*编辑二:我注意到图像正在改变,所以上面的 XPath 不再工作了

【问题讨论】:

  • 分享您的工作表副本
  • 从您的示例值来看,src 的值似乎是 SVG 的数据 URL。在这种情况下,我可以问您要检索的值吗?顺便问一下,为了确认您的问题,能否提供一下网址?
  • 您好,感谢您的回复。特此表格链接:docs.google.com/spreadsheets/d/…
  • 感谢您的回复。当我看到您的示例电子表格时,我在https://next.ibood.com/nl/nl/electronics 找不到您想要检索的images0.ibood.com/686136/large/lg-soundbar-sl8yg-subwoofer.jpg 的值。这个怎么样?
  • 这里也一样:-(。随着图像每天都在变化,价值消失了。我是菜鸟,很难获得图像的价值(主产品图像https://next.ibood.com/nl/nl/electronics)我想使用正确的类进行检索。使用//img/@src 时,您将看到我最初的挑战,出现编码错误data:image/svg+xml,%3Csvg xmlns=""http://www.w3.org/2000/svg"" viewBox=""0 0 200 100""%3E%3C/svg%3E。还添加到工作表中:docs.google.com/spreadsheets/d/…。有什么想法吗?

标签: parsing google-apps-script xpath google-sheets google-sheets-formula


【解决方案1】:

当我看到https://next.ibood.com/nl/nl/electronics的HTML时,似乎你要检索的值是由Javascript创建的。因此,不幸的是,IMPORTXML 无法使用 xpath 直接检索该值。但我注意到您想要的值包含在 HTML 中的 JSON 对象中。但是,不幸的是,数据大小超过 50,000 个字符。 Ref 在这种情况下,IMPORTXML 无法检索到该值。

因此,在这个答案中,我想建议使用由 Google Apps 脚本创建的自定义函数来实现您的目标。

示例脚本:

请将以下脚本复制并粘贴到电子表格的脚本编辑器中。并且,请将=SAMPLE1("https://next.ibood.com/nl/nl/electronics") 和=SAMPLE2("https://next.ibood.com/nl/nl/electronics") 放入单元格中。这样,值就被检索到了。

function SAMPLE1(url) {
  const html = UrlFetchApp.fetch(url).getContentText();
  const str = html.match(/<script id=\"__NEXT_DATA__\" type=\"application\/json\">(.+?)<\/script>/);
  if (str.length == 2) {
    const obj = JSON.parse(str[1].trim());
    const value = obj.props.pageProps.initialReduxState.slotItems.mainOffer.imageSrc;
    if (value) {
      return `https:${value}`;
    }
  }
  return "No value";
}

function SAMPLE2(url) {
  const html = UrlFetchApp.fetch(url).getContentText();
  const str = html.match(/<script id=\"__NEXT_DATA__\" type=\"application\/json\">(.+?)<\/script>/);
  if (str.length == 2) {
    const obj = JSON.parse(str[1].trim());
    const value = obj.props.pageProps.initialReduxState.slotItems.offers.map(({imageSrc}) => `https:${imageSrc}`);
    if (value.length > 0) {
      return value;
    }
  }
  return "No value";
}
  • 在此示例脚本中,首先检索 HTML,检索 JSON 对象,并从解析的 JSON 对象中返回值。
  • 当我看到 HTML 数据时,我注意到有 2 种图像源。一个是mainOffer(这个值是由SAMPLE1()获取的。)。另一个是offer(这个值是由SAMPLE2()获取的。)。根据您的问题,我认为您可能想要mainOffer 的 URL。但是当我通过浏览器查看时,我注意到站点中的图像存在与mainOffer的图像不同的情况。我不确定这是什么原因。所以我提出了 2 种模式。

结果:

使用上述脚本时,得到以下结果。

参考资料:

【讨论】:

  • 非常感谢@Tanaike!结果完全符合预期。解决方案和您的奉献促使我在接下来的几周内更深入地研究 XPath 和 Apps 脚本 :-)。再次感谢您的时间和解决方案!
  • @Jesper 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 2019-03-15
相关资源
最近更新 更多