在简单的网络抓取查询中使用 Google 表格的 ImportXML XPath 问题
ImportXML XPath issue using Google Sheets on a simple web scraping query
我一直在尝试使用 google 工作表从 url https://www.pro-football-reference.com/boxscores/201912290car.htm.[=17= 中抓取高级接收 table 数据来导入 xml,但没有成功]
我试过直接从 chrome 的检查 chrome 页面复制的 XPath://*[@id="div_receiving_advanced"]
我总是收到“导入的内容为空”错误消息。
我很困惑,因为它使用以下 XPath 处理传递、冲刺和接收 table 数据://*[@id="div_player_offense"]
当我使用 //*[@id="all_receiving_advanced"]
的 XPath 时,我得到以下结果。
unparsed results
但是,我想解析第 2 列的数据,使其看起来像这样。
parsed results
如有任何帮助,我们将不胜感激。
由于某些播放器没有特定列的值(例如:“Rec/Br”),直接转换IMPORTXML
返回的数据将产生乱码table。
2个解决方案:
A) 使用 IMPORTFROMWEB
addon(免费计划中的请求数量受到限制)激活 JS 渲染并保留基本选择器选项数据结构。数据所需的 XPath 表达式:
/th/a
/td[@data-stat="team"]
/td[@data-stat="targets"]
/td[@data-stat="rec"]
/td[@data-stat="rec_yds"]
/td[@data-stat="rec_first_down"]
/td[@data-stat="rec_air_yds"]
/td[@data-stat="rec_air_yds_per_rec"]
/td[@data-stat="rec_yac"]
/td[@data-stat="rec_yac_per_rec"]
/td[@data-stat="rec_broken_tackles"]
/td[@data-stat="rec_broken_tackles_per_rec"]
/td[@data-stat="rec_drops"]
/td[@data-stat="rec_drop_pct"]
对于 headers :
//div[@id="div_receiving_advanced"]//th[contains(@class,"poptip")]
对于基本选择器:
//div[@id="div_defense_advanced"]//tr[@data-row][not(@class)]
C6中使用的公式:
IMPORTFROMWEB(B1;B2:O2;B3:C4)
输出:
旁注:IMPORTFROMWEB
经常输出加载错误。
B) 使用 IMPORTDATA
和公式生成 table。首先,我们使用过滤器 (QUERY
) 加载感兴趣的数据。然后我们用 SUBSTITUTE
修复空白单元格问题。之后我们使用 REGEXEXTRACT
提取数据。最后,我们应用最后一个过滤器和 SPLIT
数据来填充单元格。
公式:
=ARRAYFORMULA(SPLIT(QUERY(ARRAYFORMULA(REGEXREPLACE(ARRAYFORMULA(SUBSTITUTE(QUERY(IMPORTDATA(B3);"select Col1 where Col1 contains 'rec_broken_tackles_per_rec'");"></td>";">0</td>"));".+htm.+?>(.+?)<.+team.+([A-Z]{3}).+targets.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+";";;;;;;;;;;;;;"));"select * WHERE NOT Col1 contains '<'");";"))
输出:
在这两种情况下,空白单元格都替换为 0
。
我的工作簿是 here。
编辑:
对于 IMPORTDATA
的“高级防御 Table”:
=ARRAYFORMULA(SPLIT(QUERY(ARRAYFORMULA(REGEXREPLACE(ARRAYFORMULA(SUBSTITUTE(QUERY(IMPORTDATA(B3);"select Col1 where Col1 contains 'def_tgt_yds_per_att'");"></td>";">0</td>"));".+htm.+?>(.+?)<.+team.+([A-Z]{3})<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?bli.+?>(.+?)<.+?qb_.+?>(.+?)<.+?qb_.+?>(.+?)<.+?sac.+?>(.+?)<.+?pre.+?>(.+?)<.+?tac.+?>(.+?)<.+?tac.+?>(.+?)<.+?tac.+?>(.+?)<.+";";;;;;;;;;;;;;;;;;;;;;"));"select * WHERE NOT Col1 contains '<'");";"))
输出:
我一直在尝试使用 google 工作表从 url https://www.pro-football-reference.com/boxscores/201912290car.htm.[=17= 中抓取高级接收 table 数据来导入 xml,但没有成功]
我试过直接从 chrome 的检查 chrome 页面复制的 XPath://*[@id="div_receiving_advanced"]
我总是收到“导入的内容为空”错误消息。
我很困惑,因为它使用以下 XPath 处理传递、冲刺和接收 table 数据://*[@id="div_player_offense"]
当我使用 //*[@id="all_receiving_advanced"]
的 XPath 时,我得到以下结果。
unparsed results
但是,我想解析第 2 列的数据,使其看起来像这样。
parsed results
如有任何帮助,我们将不胜感激。
由于某些播放器没有特定列的值(例如:“Rec/Br”),直接转换IMPORTXML
返回的数据将产生乱码table。
2个解决方案:
A) 使用 IMPORTFROMWEB
addon(免费计划中的请求数量受到限制)激活 JS 渲染并保留基本选择器选项数据结构。数据所需的 XPath 表达式:
/th/a
/td[@data-stat="team"]
/td[@data-stat="targets"]
/td[@data-stat="rec"]
/td[@data-stat="rec_yds"]
/td[@data-stat="rec_first_down"]
/td[@data-stat="rec_air_yds"]
/td[@data-stat="rec_air_yds_per_rec"]
/td[@data-stat="rec_yac"]
/td[@data-stat="rec_yac_per_rec"]
/td[@data-stat="rec_broken_tackles"]
/td[@data-stat="rec_broken_tackles_per_rec"]
/td[@data-stat="rec_drops"]
/td[@data-stat="rec_drop_pct"]
对于 headers :
//div[@id="div_receiving_advanced"]//th[contains(@class,"poptip")]
对于基本选择器:
//div[@id="div_defense_advanced"]//tr[@data-row][not(@class)]
C6中使用的公式:
IMPORTFROMWEB(B1;B2:O2;B3:C4)
输出:
旁注:IMPORTFROMWEB
经常输出加载错误。
B) 使用 IMPORTDATA
和公式生成 table。首先,我们使用过滤器 (QUERY
) 加载感兴趣的数据。然后我们用 SUBSTITUTE
修复空白单元格问题。之后我们使用 REGEXEXTRACT
提取数据。最后,我们应用最后一个过滤器和 SPLIT
数据来填充单元格。
公式:
=ARRAYFORMULA(SPLIT(QUERY(ARRAYFORMULA(REGEXREPLACE(ARRAYFORMULA(SUBSTITUTE(QUERY(IMPORTDATA(B3);"select Col1 where Col1 contains 'rec_broken_tackles_per_rec'");"></td>";">0</td>"));".+htm.+?>(.+?)<.+team.+([A-Z]{3}).+targets.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+?rec.+?>(.+?)<.+";";;;;;;;;;;;;;"));"select * WHERE NOT Col1 contains '<'");";"))
输出:
在这两种情况下,空白单元格都替换为 0
。
我的工作簿是 here。
编辑:
对于 IMPORTDATA
的“高级防御 Table”:
=ARRAYFORMULA(SPLIT(QUERY(ARRAYFORMULA(REGEXREPLACE(ARRAYFORMULA(SUBSTITUTE(QUERY(IMPORTDATA(B3);"select Col1 where Col1 contains 'def_tgt_yds_per_att'");"></td>";">0</td>"));".+htm.+?>(.+?)<.+team.+([A-Z]{3})<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?def.+?>(.+?)<.+?bli.+?>(.+?)<.+?qb_.+?>(.+?)<.+?qb_.+?>(.+?)<.+?sac.+?>(.+?)<.+?pre.+?>(.+?)<.+?tac.+?>(.+?)<.+?tac.+?>(.+?)<.+?tac.+?>(.+?)<.+";";;;;;;;;;;;;;;;;;;;;;"));"select * WHERE NOT Col1 contains '<'");";"))
输出: