GDocs ImportHTML/XML 没有得到正确的数据
GDocs ImportHTML/XML not getting proper data
我有一个简单的 Google 电子表格问题。我正在尝试拉入 table,但使用 ImportHTML 时运气不佳,它只会拉出第一个顶部单元格并以某种方式复制它。我还尝试了 ImportXML,使用 XPath Helper 获取正确的 XPath,它也不会加载正确的 table 数据。
Google 文档:
https://docs.google.com/spreadsheets/d/1-toAivOhywZuErHK0LB5EADiMu_T9ZNUTgMhqFRBHOU/edit?usp=sharing
我需要的是以下站点的底部 table(id='player_gbs'):
http://www.forge-db.com/us/us18/players/profile/?server=us18&world=Sinerania&id=12497
这是我迄今为止尝试过的方法,这些在 GDoc 中也都有体现。
=ImportHTML(B1, "table", 2)
Returns 下面一行两次:
"Great Building Era Lvl FP Req. FP FP Left 24h +"
=ImportXML(B1, "/html/body/div[@class='wrap']/div[@class='content'][2]/div[@class='b-box']")
Returns:
"GB's with a new level in the last 24 hours are shown with a yellow
background" Great BuildingEraLvlFPReq. FPFP Left24h +Great BuildingEraLvlFPReq. FPFP Left24h +"
认为问题是包含在 /div 中的是 <thead> and <tfoot> before <tbody>
所以我尝试了这个 XPath 并得到了 N/A:
=ImportXML(B1, "/html/body/div[@class='wrap']/div[@class='content'][2]/div[@class='b-box']/div[@id='player_gbs_wrapper']/table[@id='player_gbs']/tbody")
我认为您的问题是 table 是通过 JSON 和 javascript 创建的。如果您在该页面上查看源代码,您会看到这个块...
<script type="text/javascript" class="init">
$(document).ready(function() {
$('#player_gbs').dataTable( {
"aLengthMenu": [[30], ['All']],
"processing": true,
"serverSide": true,
"ajax": "../../getPlayerGBs.php?id=12497&server=us18",
这告诉我们数据来自以下URL。
http://www.forge-db.com/us/us18/getPlayerGBs.php?id=12497&server=us18
URL 正在提供填充 table 的数据。
此脚本 (based off this SO response) 将解析来自该提要的数据并将其写入 sheet 标题为 dataImport。它只获取前两个数据块,你只需扩展循环来做更多的事情。
function urlDownload() {
var dataImport = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('dataImport');
var apiPoint = "http://www.forge-db.com/us/us18/getPlayerGBs.php?id=12497&server=us18";
var response = UrlFetchApp.fetch(apiPoint);
var response_json = JSON.parse(response.getContentText());
var length = response_json.data.length;
var a = [];
for(i=0; i<length; i++){
dataImport.getRange(i+2, 1, 1, 1).setValue(response_json.data[i][0])
dataImport.getRange(i+2, 2, 1, 1).setValue(response_json.data[i][1])
}
}
我有一个简单的 Google 电子表格问题。我正在尝试拉入 table,但使用 ImportHTML 时运气不佳,它只会拉出第一个顶部单元格并以某种方式复制它。我还尝试了 ImportXML,使用 XPath Helper 获取正确的 XPath,它也不会加载正确的 table 数据。
Google 文档:
https://docs.google.com/spreadsheets/d/1-toAivOhywZuErHK0LB5EADiMu_T9ZNUTgMhqFRBHOU/edit?usp=sharing
我需要的是以下站点的底部 table(id='player_gbs'):
http://www.forge-db.com/us/us18/players/profile/?server=us18&world=Sinerania&id=12497
这是我迄今为止尝试过的方法,这些在 GDoc 中也都有体现。
=ImportHTML(B1, "table", 2)
Returns 下面一行两次: "Great Building Era Lvl FP Req. FP FP Left 24h +"
=ImportXML(B1, "/html/body/div[@class='wrap']/div[@class='content'][2]/div[@class='b-box']")
Returns:
"GB's with a new level in the last 24 hours are shown with a yellow background" Great BuildingEraLvlFPReq. FPFP Left24h +Great BuildingEraLvlFPReq. FPFP Left24h +"
认为问题是包含在 /div 中的是 <thead> and <tfoot> before <tbody>
所以我尝试了这个 XPath 并得到了 N/A:
=ImportXML(B1, "/html/body/div[@class='wrap']/div[@class='content'][2]/div[@class='b-box']/div[@id='player_gbs_wrapper']/table[@id='player_gbs']/tbody")
我认为您的问题是 table 是通过 JSON 和 javascript 创建的。如果您在该页面上查看源代码,您会看到这个块...
<script type="text/javascript" class="init">
$(document).ready(function() {
$('#player_gbs').dataTable( {
"aLengthMenu": [[30], ['All']],
"processing": true,
"serverSide": true,
"ajax": "../../getPlayerGBs.php?id=12497&server=us18",
这告诉我们数据来自以下URL。 http://www.forge-db.com/us/us18/getPlayerGBs.php?id=12497&server=us18
URL 正在提供填充 table 的数据。
此脚本 (based off this SO response) 将解析来自该提要的数据并将其写入 sheet 标题为 dataImport。它只获取前两个数据块,你只需扩展循环来做更多的事情。
function urlDownload() {
var dataImport = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('dataImport');
var apiPoint = "http://www.forge-db.com/us/us18/getPlayerGBs.php?id=12497&server=us18";
var response = UrlFetchApp.fetch(apiPoint);
var response_json = JSON.parse(response.getContentText());
var length = response_json.data.length;
var a = [];
for(i=0; i<length; i++){
dataImport.getRange(i+2, 1, 1, 1).setValue(response_json.data[i][0])
dataImport.getRange(i+2, 2, 1, 1).setValue(response_json.data[i][1])
}
}