在刮纸(rvest)时替换缺少的值

在刮纸(rvest)时替换缺少的值,r,dataframe,rvest,R,Dataframe,Rvest,我正试图写一个脚本,通过Transfermarkt网站提供的玩家列表,收集他们的一些信息。为此,我创建了下面的脚本,但在游戏中29名玩家中有1名遇到了问题。由于一个页面的排列方式与其他页面不同,代码只输出28名玩家的列表,因为它无法在上述页面上找到信息 我理解为什么我写的代码在给定的页面上找不到任何信息,因此给了我28个列表,但我不知道如何重写代码以实现我想要的: 对于脚本来说,如果在特定页面上的节点没有找到任何东西(在本例中是国籍),只需将条目替换为“-”,然后返回一个包含29名玩家的完整列表

我正试图写一个脚本,通过Transfermarkt网站提供的玩家列表,收集他们的一些信息。为此,我创建了下面的脚本,但在游戏中29名玩家中有1名遇到了问题。由于一个页面的排列方式与其他页面不同,代码只输出28名玩家的列表,因为它无法在上述页面上找到信息

我理解为什么我写的代码在给定的页面上找不到任何信息,因此给了我28个列表,但我不知道如何重写代码以实现我想要的: 对于脚本来说,如果在特定页面上的节点没有找到任何东西(在本例中是国籍),只需将条目替换为“-”,然后返回一个包含29名玩家的完整列表,其中包含所有其他信息

有问题的播放器页面是,而其他页面有国籍代码中使用的节点,这里是“.dataValue span”

我对R还是一个新手,这可能是一个很容易解决的问题,但我无法理解。任何帮助或建议都将不胜感激

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中随处可见。