r - 来自抓取数据的一对多变量
问题描述
我正在尝试从网站中提取数据。我正在使用的脚本如下:
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 个。
我将把它作为一个更大函数的一部分来运行,所以我不知道这些类型的边缘情况何时会出现,但它们会出现。
解决方案
这是一个替代方案。此解决方案找到 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]
推荐阅读
- sql - 用于返回链的 SQL 查询
- teamcity - 有没有办法确定哪个项目和用户拥有或关联了 Team City 中的代理
- gpgpu - 在 HLSL 中投射组共享内存
- docker - 如何创建操作系统的 docker 映像,特别是 Armbian?
- binary - 如何使用浮点变量存储二进制网格
- powerbi - 默认切片器选择
- javascript - 调用 API Gateway 时出现 ```apigClient.testMyApiPost is not a function``` 错误?
- mysql - sequelize 迁移中应该包括什么?
- python - 如何使用 Python 在客户端打印数据
- dataframe - 如何使用数据库事务编写 Spark 数据帧