在刮纸(rvest)时替换缺少的值
我正试图写一个脚本,通过Transfermarkt网站提供的玩家列表,收集他们的一些信息。为此,我创建了下面的脚本,但在游戏中29名玩家中有1名遇到了问题。由于一个页面的排列方式与其他页面不同,代码只输出28名玩家的列表,因为它无法在上述页面上找到信息 我理解为什么我写的代码在给定的页面上找不到任何信息,因此给了我28个列表,但我不知道如何重写代码以实现我想要的: 对于脚本来说,如果在特定页面上的节点没有找到任何东西(在本例中是国籍),只需将条目替换为“-”,然后返回一个包含29名玩家的完整列表,其中包含所有其他信息 有问题的播放器页面是,而其他页面有国籍代码中使用的节点,这里是“.dataValue span” 我对R还是一个新手,这可能是一个很容易解决的问题,但我无法理解。任何帮助或建议都将不胜感激在刮纸(rvest)时替换缺少的值,r,dataframe,rvest,R,Dataframe,Rvest,我正试图写一个脚本,通过Transfermarkt网站提供的玩家列表,收集他们的一些信息。为此,我创建了下面的脚本,但在游戏中29名玩家中有1名遇到了问题。由于一个页面的排列方式与其他页面不同,代码只输出28名玩家的列表,因为它无法在上述页面上找到信息 我理解为什么我写的代码在给定的页面上找不到任何信息,因此给了我28个列表,但我不知道如何重写代码以实现我想要的: 对于脚本来说,如果在特定页面上的节点没有找到任何东西(在本例中是国籍),只需将条目替换为“-”,然后返回一个包含29名玩家的完整列表
URL <- "http://www.transfermarkt.de/fc-bayern-munchen/leistungsdaten/verein/27/reldata/%262016/plus/1"
WS <- read_html(URL)
Team <- WS %>% html_nodes(".spielprofil_tooltip") %>% html_attr("href") %>% as.character()
Team <- paste0("http://www.transfermarkt.de",Team)
Catcher <- data.frame(Name=character(),Nat=character(),Vertrag=character())
for (i in Team) {
WS1 <- read_html(i)
Name <- WS1 %>% html_nodes("h1") %>% html_text() %>% as.character()
Nat <- WS1 %>% html_nodes(".hide-for-small+ p .dataValue span") %>% html_text() %>% as.character()
Vertrag <- WS1 %>% html_nodes(".dataValue:nth-child(9)") %>% html_text() %>% as.character()
if (length(Nat) > 0) {
temp <- data.frame(Name,Nat,Vertrag)
Catcher <- rbind(Catcher,temp)
}
else {}
cat("*")
}
num_Rows <- nrow(Catcher)
odd_indexes <- seq(1,num_Rows,2)
Catcher <- data.frame(Catcher[odd_indexes,])
URL%as.character()
团队%html_text()%%>%as.character()
Vertrag%html\u节点(“.dataValue:n子节点(9)”)%%>%html\u文本()%%>%as.character()
如果(长度(Nat)>0){
temp确实更容易刮取整个表,以防事情发生变化。我发现purrr
是rvest
的有益补充,允许您迭代URL和节点列表,并轻松地将结果强制为数据帧:
库(rvest)
图书馆(purrr)
#如果愿意,可以动态构建
URL%
地图测向(地图测向,
~list(
变量=.x%>%html\u节点('.dataItem')%>%html\u文本(trim=TRUE),
value=.x%>%html\u节点('.dataValue')%%>%html\u文本(trim=TRUE)%%>%gsub('\\s+','','')
),
.id='player')
df
#>#A tibble:17×3
#>玩家变量值
#>
#>1博阿滕阁/更改:1988年9月3日(28)
#>2博阿滕格伯特斯波特:柏林
#>3博阿滕民族:德国
#>4博阿滕峡谷:1,92米
#>5博阿滕职位:Innenverteidger
#>6 boateng Vertrag之二:2021年6月30日
#>7博阿滕:山姆体育
#>8博阿滕国家队斯皮尔勒:德国队
#>9 boateng Länderspiele/Tore:67/1
#>10 friedl Geb./Alter:16.03.1998(19)
#>11弗里德尔民族主义:奥斯特赖希
#>12弗里德尔·格瑞:1,87米
#>13 friedl位置:链接器VerteDiger
#>14弗里德尔·维特拉格之二:2021年6月30日
#>15弗里德尔·伯雷特:行动7
#>16 friedl Akt.Nationalspieler:Österreich U19
#>17弗里德尔·朗德斯皮尔/托雷:6/0
或者,该特定数据块位于这些页面的三个位置,因此如果其中一个不一致,则其他数据可能更好。或者从表格中获取这些数据,因为整个国家队都没有打印出来,但它们位于旗帜图像的title
属性中,可以使用html\u attr
获取:
html%
map\u df(~list(player=.x%>%html\u节点('a.spielprofil\u工具提示')%%>%html\u text(),
国籍=.x%>%html\u节点('img.flaggenrahmen')%%>%html\u属性('title')%%>%toString())
团队
#>#A tibble:29×2
#>球员国籍
#>
#>1曼努埃尔·纽尔德国
#>2斯文乌尔赖希德国
#>3汤姆斯塔克德国
#>4 Jérôme Boateng Deutschland
#>5大卫·阿拉巴·奥斯特里奇
#>6席德国悍马酒店
#>7哈维·马丁内斯·斯潘
#>8胡安·伯纳特·斯潘尼安
#>9菲利普拉姆德国
#>10德国拉芬哈巴西酒店
#>#…还有19行
谢谢你的建议!我肯定会很快查看purr,但现在我只是用一个“if”语句做了一个简单的修复。至少,尝试使用lappy
(相当于purr::map
)而不是for
循环;你会发现它是一个更有用的结构,在R中随处可见。