使用 rvest 抓取类似名称的表

Posted

技术标签:

【中文标题】使用 rvest 抓取类似名称的表【英文标题】:Scraping similarly named tables using rvest 【发布时间】:2020-09-20 04:16:29 【问题描述】:

我正在尝试使用 rvest 从 fbref.com 上的不同页面抓取数据表。我已经能够使用以下方法从一页中抓取数据:

library(rvest)
URL <- "https://fbref.com/en/squads/822bd0ba/Liverpool"
WS <- read_html(URL)
passStats <- WS %>% rvest::html_nodes(xpath = '//*[(@id = "ks_sched_all")]') %>% rvest::html_table() %>% data.frame()

但是当我尝试使用 for 循环将其应用于多个页面时,我遇到了一个问题,因为并非所有页面都对表使用相同的 id。有些是“ks_sched_all”,有些是“ks_sched_(4 位数字)”。有什么方法可以提取页面上任何一个 id 以“ks_sched_”开头的表?

【问题讨论】:

必须考虑在您的 xpath 中使用 starts-with 吗? 谢谢,我尝试过使用xpath = "//*[starts-with(@id, 'ks_sched_')]" ,但它不会将其作为表格刮掉,并给出html_name(x) == "table" is not TRUE 的错误。知道为什么会这样吗? 【参考方案1】:

您可以将table 添加到您的XPath 表达式和()。代码可以是:

library(rvest)
URL <- "https://fbref.com/en/squads/822bd0ba/Liverpool"
WS <- read_html(URL)


results=list()
i=1

for (tables in 1:length(html_nodes(x = WS,xpath = "//table[starts-with(@id,'ks_sched_')]"))) 
path=paste0('(//table[starts-with(@id,"ks_sched_")])[',i,']')
results[[i]] <- WS %>% html_nodes(xpath = path) %>% html_table() %>% data.frame()
i=i+1

我们使用for 循环,使用length 获取表的数量,每次使用paste0 生成一个新的XPath,并将结果存储在list 中。

输出:7 个数据帧的列表

【讨论】:

以上是关于使用 rvest 抓取类似名称的表的主要内容,如果未能解决你的问题,请参考以下文章

使用 rvest 迭代地抓取许多链接时找到标签的替代版本

使用RVest从网站抓取表格

使用 rvest 抓取可折叠表的问题

rvest - 在 1 个标签中抓取 2 个类

用rvest抓取时没有数据

Rvest 和 Google 新闻网页抓取:不起作用