R语言网页爬取创建data.frame报参数行数不一致错误的解决
报错核心原因
触发Error in data.frame arguments imply differing number of rows的本质是每个爬取字段的向量长度不一样,拼数据框时行数对不上,对应你代码里的具体问题:
- 目标NHL数据全在id为
example的表格里,但你除了rank字段,其余字段的选择器没有限定在这个表格范围内。直接写:nth-child(4)这种全局规则,会把整个网页上所有“是父元素第4个节点”的元素都抓下来,数量远大于表格实际行数。 - 部分选择器逻辑完全错位:比如
.text-left:nth-child(2)选的是“带text-left类的元素下面的第2个子节点”,不是你要的“表格里第2列的球员名字单元格”,抓到的根本不是目标数据。 - 最终各个字段的向量长度从几个到几百个不等,拼数据框的时候自然会报错。
修复后可直接运行的代码
library(rvest) link = "http://www.hockeycentral.co.uk/nhl/records/alltimegoal.php" page = read_html(link) # 先锁定表格里的所有有效数据行,排除表头 table_rows = page %>% html_nodes("#example tbody tr") # 逐行提取每个字段,保证所有字段长度和数据行数完全一致 rank = table_rows %>% html_node("td:nth-child(1)") %>% html_text(trim = TRUE) player = table_rows %>% html_node("td:nth-child(2)") %>% html_text(trim = TRUE) teams = table_rows %>% html_node("td:nth-child(3)") %>% html_text(trim = TRUE) goals = table_rows %>% html_node("td:nth-child(4)") %>% html_text(trim = TRUE) games = table_rows %>% html_node("td:nth-child(5)") %>% html_text(trim = TRUE) assists = table_rows %>% html_node("td:nth-child(6)") %>% html_text(trim = TRUE) points = table_rows %>% html_node("td:nth-child(7)") %>% html_text(trim = TRUE) PPG = table_rows %>% html_node("td:nth-child(8)") %>% html_text(trim = TRUE) SHG = table_rows %>% html_node("td:nth-child(9)") %>% html_text(trim = TRUE) # 所有字段长度完全对齐,直接拼数据框即可 nhlcareer = data.frame( rank, player, teams, goals, games, assists, points, PPG, SHG, stringsAsFactors = FALSE )
同类问题快速排查技巧
下次爬取再遇到类似行数不匹配的报错,直接打印每个字段的向量长度,就能快速定位哪个字段的选择器写错了:
# 输出每个字段的向量长度 c( length(rank), length(player), length(teams), length(goals), length(games), length(assists), length(points), length(PPG), length(SHG) )
只有所有返回值完全相等时,才能正常拼成数据框;如果某一个字段的长度和其他值差很多,就把该字段的选择器范围缩小到目标表格的对应单元格里就行。
内容的提问来源于stack exchange,提问作者Ange
相关产品推荐
相关产品推荐

