【问题标题】:unable to IMPORTXML stats from a form to Google Sheets - imported content is empty error无法将表单中的 IMPORTXML 统计信息导入 Google 表格 - 导入的内容为空错误
【发布时间】:2020-05-17 13:37:10
【问题描述】:

我正在尝试从这个网站将 XML 数据导入我的谷歌表格:

https://pick224.com/

我使用复制 Xpath 选项来获取“xpath_query”,但这不起作用。

=IMPORTXML("https://pick224.com/","/*[@id='DataRow31623_e9a5c9026c6106']/td[11]")

后来我也尝试了复制完整 Xpath 选项,但这也没有用,我得到了同样的 #N/A 错误。

Here is the specific element I want to grab from the site

是否有任何事情阻止我从该站点收集数据,或者我只是没有正确地收集数据?

过去几天我一直在尝试解决这个问题,因此我将不胜感激。 这是我的谷歌表:

https://docs.google.com/spreadsheets/d/17i5Q5_8c_LqY7S361TPI4NRZZUOdlJ_0aa3vWiVGd7c/edit?usp=sharing

【问题讨论】:

  • 那是iddynamic吗?
  • 我相信不是,因为每一行都属于一个独特的玩家。在“DataRow31623_e9a5c9026c6106”中,“31623”标识玩家。
  • 您可以尝试使用XPath Finder 扩展名吗?它给出了完整的路径。
  • 我已经尝试粘贴到完整路径中,但没有成功:/html/body/div[2]/div[2]/div/div/div[1]/form/ div/div/div/table[1]/tbody/tr[2]/td[11]
  • 观察我发现this url的源代码是由javascript调用的。可以查询这个网址吗?但是,在您的情况下,网址可能会有所不同。尤其是最后一部分,即 9b0d7000447c1af4abb545f3b8ae 。相应地更改并尝试一次并告诉您的结果:)

标签: html xpath google-sheets google-sheets-importxml


【解决方案1】:

下载整个 .csv 数据的 url 似乎是固定的(不需要appsession 部分)。

https://c0dcn566.caspio.com/dp/9b0d7000447c1af4abb545f3b8ae?RecordID=&PageID=2&PrevPageID=&cpipage=3&download=1&CPIorderBy=P1GP&CPISortType=desc&downloadFormat=csv

但是,由于文件太大,您无法使用IMPORTDATA 步骤直接导入它。所以你必须编写一个 GoogleAppScript。

如果您认为 .csv 文件的 url 可能会更改,您可以使用 IMPORTFROMWEB 并激活 javascript 呈现来检索地址。该插件并非完全免费。检查免费计划的限制。

A1:感兴趣的网站; A2:XPath 表达式; A3:B3 : 激活 javascript 的选项 (TRUE)

A4 中的公式(Concat+Regex):

="https://c0dcn566.caspio.com/dp/"&REGEXEXTRACT(IMPORTFROMWEB(A1;A2;A3:B3);"""appKey"":""(.+?)""")&"?RecordID=&PageID=2&PrevPageID=&cpipage=3&download=1&CPIorderBy=P1GP&CPISortType=desc&downloadFormat=csv"

这样,您始终拥有用于下载 .csv 的最新更新网址。

您也可以使用IMPORTFROMWEB 检索数据,但仅用于第一页(100 个结果)。增加 url 中的 cpipage 参数不足以加载和获取 GoogleSheets 中的其余数据。前 5 列的示例:

GoogleAppScript 部分。在脚本编辑器中,您现在可以使用这种脚本(source):

function importCSVFromWeb() {

      // Provide the full URL of the CSV file.
      //var csvUrl = "https://c0dcn566.caspio.com/dp/9b0d7000447c1af4abb545f3b8ae?RecordID=&PageID=2&PrevPageID=&cpipage=3&download=1&CPIorderBy=P1GP&CPISortType=desc&downloadFormat=csv";
      var csvUrl = SpreadsheetApp.getActiveSheet().getRange(4, 1).getValue();
      var csvContent = UrlFetchApp.fetch(csvUrl).getContentText();
      var csvData = Utilities.parseCsv(csvContent);

      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);

    }

你可以直接用csv的固定url声明csvUrl变量。或者使用您使用IMPORTFROMWEB 构建的网址。在这种情况下,您必须指定包含地址的单元格的位置(示例中的第 4 行,第 1 列)。

运行脚本后,活动工作表将填充数据。警告:它可能会给你的 CPU 带来压力。加载数据后,您可以创建一个新工作表并使用QUERYFILTERSORT、...来转换之前创建的表。 如果你想要一些自动的东西(脚本在没有你干预的情况下启动),你应该使用triggers

或者,您也可以编写自定义函数来加载 csv。但这有点棘手,因为您需要在导入数据之前过滤数据。否则你会得到一个“太大”的错误。例如,要只保留“AHL”联赛的球员,您可以编写如下内容(基础脚本归功于 @Cooper):

function importCSV(url) {
  var csvContent = UrlFetchApp.fetch(url).getContentText();
  var csvData = Utilities.parseCsv(csvContent);
  var x = 'AHL';
  var d=0;
 for(var i=0;(i-d)<csvData.length;i++) {
    if(csvData[i-d][0]!==x) {
      csvData.splice(i-d++,1);
    }
  }
  return csvData;
 }

所以现在,您可以使用“importCSV”公式(importCSV(url.retrieved.with.IMPORTFROMWEB 或 fixed.url))来加载数据:

到此为止。

【讨论】:

  • 很高兴看到您解决了这个问题:) 您是如何计算出这部分的:url 参数?早些时候,我在开发工具中只看到普通的 POST 请求。 @E.Wiest
  • 嗨。您可能已经知道,参数来自页面左侧的“下载数据”链接。加载(移至下一页)/过滤数据(选择特定项目)的另一个选项确实可以使用 GoogleAppScript 模拟 POST 请求。
  • 啊,确实。我一直无视它。 @E.Wiest
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多