首页 > 解决方案 > 来自抓取数据的一对多变量

问题描述

我正在尝试从网站中提取数据。我正在使用的脚本如下:

library(tidyverse)
library(rvest)
library(dplyr)
library(tidyr)
library(sqldf)

cb_url <- paste0("https://247sports.com/Season/2022-Football/TargetPredictions/?Page=24")

cb_team_gather <- map_df(cb_url, ~.x %>% read_html %>%
                                html_nodes(".prediction img, .icon-zero") %>%
                                html_attr('alt') %>%
                                str_trim %>% 
                                str_split("   ") %>% 
                                matrix(ncol = 1, byrow = T) %>% 
                                as.data.frame)

如果您运行该脚本,请注意它会返回 51 个观察值。我试图让它每页产生 50 个观察结果。我选择这个特定页面的原因?Page=24,是因为它包含我正在尝试解决的边缘情况的示例。

您会注意到此页面上的大多数项目如下所示: 在此处输入图像描述

只有一张附属图像。这些变量在使用上述脚本创建的数据框中显示为第 12 行和第 13 行。边缘情况是这样的变量:

在此处输入图像描述

html_attr请注意,在这种情况下,我试图提取两个附属图像。这显示在从上面的脚本创建的数据框中的第 14 行和第 15 行中。问题是,我需要的唯一数据来自该屏幕截图中的第二张图片(在此示例中Texas A&M,该图片Oklahoma State不相关)。这导致有 51 个观察值而不是 50 个。

我将把它作为一个更大函数的一部分来运行,所以我不知道这些类型的边缘情况何时会出现,但它们会出现。

标签: rdplyrpurrrrvest

解决方案


这是一个替代方案。此解决方案找到 50 所首选学校,然后查找任何翻转的选择,然后将两个列表合并在一起。

page <- read_html(cb_url)

mainschools <-page %>% html_nodes("li.target") %>%
   html_node(".prediction img, .icon-zero") %>%
   html_attr('alt') %>% str_trim 

flippedschools <- page %>% html_nodes("li.target") %>%
   html_node("div.flipped-wrap img") %>% 
   html_attr('alt') %>%  str_trim

flipped <- which(!is.na(flippedschools))

mainschools[flipped] <- flippedschools[flipped]

推荐阅读