【问题标题】:R web scraping packages failing to read in all tables of urlR web 抓取包无法读取所有 url 表
【发布时间】:2023-07-17 21:59:01
【问题描述】:

我正在尝试从以下链接中抓取一些表格: 'https://www.pro-football-reference.com/boxscores/201209050nyg.htm' 从尝试多种方法/包中可以看出,我认为 R 无法读取整个 url。以下是我所做的一些尝试:

a <- getURL(url)
tabs <- readHTMLTable(a, stringsAsFactors = T)

x <- read_html(url)
y <- html_nodes(x,xpath= '//*[@id="div_home_snap_counts"]')

我已经成功地用这两种方法阅读了前两个表,但之后无论我使用 xpath 还是 css,我都无法阅读任何其他表。有谁知道为什么我没有阅读这些后来的表格?

【问题讨论】:

  • @Dev 我在这里没有真正看到问题 - OP 提供了一些代码并解释了工作和效果。

标签: r web-scraping rvest rcurl


【解决方案1】:

如果您使用 Chrome 之类的浏览器,您可以进入设置并禁用 javascript。然后您会看到只有几张桌子。其余的需要运行 javascript 才能加载。当您使用当前方法时,这些不会被加载,如浏览器中显示的那样。可能的解决方案是:

  1. 使用 RSelenium 之类的方法可以让 javascript 运行
  2. 检查页面的 HTML 以查看信息是否存储在其他地方并且可以从那里获取。有时信息是从script 标签中检索到的,例如,它存储为 json/javascript 对象
  3. 刷新页面时监控网络流量(F12 打开开发工具,然后打开网络选项卡),查看是否可以找到加载附加内容的源。您可能会发现其他可以使用的端点)。

查看页面似乎至少有两个丢失的表(可能全部)实际上存储在返回的 html 中的 cmets 中,与具有类 placeholder 的 div 相关联;并且您需要删除 cmets 标记,或使用允许解析 cmets 的方法。据推测,当 javascript 运行时,这些 cmets 会转换为显示的内容。

这是一个来自 html 的示例:

查看@alistaire 的answer,一种方法如下(如上图所示为单个示例表)

library(rvest)

h <- read_html('https://www.pro-football-reference.com/boxscores/201209050nyg.htm')

df <- h %>% html_nodes(xpath = '//comment()') %>%   
  html_text() %>%  
  paste(collapse = '') %>%   
  read_html() %>%  
  html_node('#game_info') %>%   
  html_table() 

【讨论】: