parsing - Google 电子表格 ImportXML / XPath - 图像损坏的输出
问题描述
我正在尝试使用 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 表格的链接:Google 表格中损坏的示例图片
*编辑二:我注意到图像正在改变,所以上面的 XPath 不再工作了
解决方案
当我看到 的 HTML 时https://next.ibood.com/nl/nl/electronics
,似乎您要检索的值是由 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
. 但是当我通过浏览器查看时,我注意到网站中的图像与mainOffer
. 我不确定这是什么原因。所以我提出了2种模式。
结果:
使用上述脚本时,会得到以下结果。
参考:
推荐阅读
- javascript - iframe Vimeo 视频结束屏幕按钮操作更改
- raspberry-pi - 在 Raspberry Pi 上安装新的 Linux 发行版
- react-native - 反应原生问题
- python - python for循环没有遍历字典列表的所有索引
- android-studio - Android Studio:如何关闭快捷方式列表选项卡
- base64 - 12C BPEL 中的 Base64 编码正在用 BPEL 变量名替换父标记
- mysql - 如何将 MySQL 的响应添加到 Redux?
- elasticsearch - ElasticSearch:Active_Primary_sherds 为 0,活动分片也为 0
- java - 覆盖 Java 中的 System 类,更准确地说是 currentTimeMillis
- django - 如何删除用户表中具有外键和配置文件表的记录?