Parsing Google电子表格导入XML/XPath-图像中断输出

Parsing Google电子表格导入XML/XPath-图像中断输出,parsing,google-apps-script,xpath,google-sheets,google-sheets-formula,Parsing,Google Apps Script,Xpath,Google Sheets,Google Sheets Formula,我试图通过使用XPath在Google Sheets中的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,'M

我试图通过使用XPath在Google Sheets中的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:这里还有谷歌页面的链接:


*编辑II:我注意到图像正在更改,因此当我看到
HTML时,上面的XPath不再工作了https://next.ibood.com/nl/nl/electronics
,您要检索的值似乎是由Javascript创建的。因此,不幸的是,
IMPORTXML
无法使用xpath直接检索该值。但是我注意到您想要的值包含在HTML中的JSON对象中。但是,不幸的是,数据大小超过50000个字符。在这种情况下,
IMPORTXML
无法检索该值

因此,在这个答案中,我想建议使用谷歌应用程序脚本创建的自定义函数来实现您的目标

示例脚本: 请将以下脚本复制并粘贴到电子表格的脚本编辑器中。请把
=SAMPLE1(“https://next.ibood.com/nl/nl/electronics“
=样本2(”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";
}
函数示例1(url){
const html=UrlFetchApp.fetch(url.getContentText();
const str=html.match(/(.+?)/);
如果(str.length==2){
const obj=JSON.parse(str[1].trim());
const value=obj.props.pageProps.initialReduxState.slotItems.mainOffer.imageSrc;
如果(值){
返回`https:${value}`;
}
}
返回“无值”;
}
函数示例2(url){
const html=UrlFetchApp.fetch(url.getContentText();
const str=html.match(/(.+?)/);
如果(str.length==2){
const obj=JSON.parse(str[1].trim());
const value=obj.props.pageProps.initialReduxState.slotItems.offers.map(({imageSrc})=>`https:${imageSrc}`);
如果(value.length>0){
返回值;
}
}
返回“无值”;
}
  • 在这个示例脚本中,首先检索HTML,检索JSON对象,并从解析的JSON对象返回值
  • 当我看到HTML数据时,我注意到有两种图像源。一个是
    mainprove
    (该值通过
    SAMPLE1()
    获得)。另一个是
    offer
    (该值通过
    SAMPLE2()
    获得)。根据您的问题,我认为您可能需要
    mainprove
    的URL。但是当我通过浏览器查看时,我注意到站点中的图像与
    mainOffer
    的图像不同。我不确定这是什么原因。所以我提出了两种模式
结果: 使用上述脚本时,将获得以下结果

参考资料:

从示例值中共享一份表单副本,
src
的值似乎是SVG的数据URL。在这种情况下,我可以询问您想要检索的值吗?顺便问一下,为了确认您的问题,您能提供URL吗?嗨,谢谢您的回复。特此附上该表的链接:谢谢您的回复。当我看到您的示例电子表格时,我无法在
找到您要检索的
images0.ibood.com/686136/large/lg-soundbar-sl8yg-subwooter.jpg
https://next.ibood.com/nl/nl/electronics
。这个怎么样?这里也一样:-(。图像每天都在变化,值就消失了。我是新手,很难获得图像的值(主产品图像位于
https://next.ibood.com/nl/nl/electronics
)我想使用正确的类检索回来。当使用
//img/@src
时,您将看到我的初始挑战,编码错误为
数据:image/svg+xml,%3Csvg xmlns=“”http://www.w3.org/2000/svg“”视图框=“0 200 100”%3E%3C/svg%3E
。也添加在表单中:。有什么想法吗?非常感谢@Tanaike!结果完全符合预期。解决方案和您的奉献精神促使我在未来几周内深入研究XPath和应用程序脚本:-)。再次感谢您的时间和解决方案@杰斯珀:谢谢你的回复。我很高兴你的问题解决了。也谢谢你。