在简单的网络抓取查询中使用 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 '<'");";"))

输出: