在R中拆分从IMDB爬取的含|符号的列失败,求解决方案
解决IMDB爬取数据的列拆分问题
我看到你在用rvest爬取IMDB的投票和票房数据时,遇到了列拆分后全为空值的问题——这其实是因为你没注意到正则表达式里的特殊字符!
问题根源
你用separate时写了sep = "|",但|在正则表达式里是元字符,代表“或”的意思,R会把它当成“任意单个字符”的分隔符,自然拆分出来全是空值。你需要把它转义成\\|(R里反斜杠要写两个才能表示一个实际的反斜杠)。
完整解决方案
下面是修正后的代码,还帮你处理了票房列的M后缀,调整成你想要的列名格式:
library(rvest) library(tidyr) library(dplyr) # 用于后续的列处理,可选但更便捷 # 你的爬取代码(不变) votes_gross <- pagesource %>% html_nodes(".sort-num_votes-visible") %>% html_text() # 清理换行符并转为数据框 votes_gross <- gsub("\\r?\\n|\\r", " ", votes_gross) votes_gross <- data.frame(votes_gross) # 修正拆分逻辑:转义|,同时开启trim自动去除空格 votes_gross <- separate( votes_gross, col = "votes_gross", into = c("Votes", "Gross"), sep = "\\|", # 关键:转义特殊字符| trim = TRUE # 自动去掉拆分后字段两边的空格,不用额外处理 ) # 处理票房列的M后缀,并重命名列 votes_gross <- votes_gross %>% mutate(Gross = gsub("M$", "", Gross)) %>% # 去掉末尾的"M" rename("Gross (Millions)" = Gross) # 修改为你想要的列名
运行后结果
执行完上面的代码,你会得到如下格式的数据框:
| Votes | Gross (Millions) |
|---|---|
| Votes: 489,547 | Gross: $700.06 |
| Votes: 615,401 | Gross: $678.82 |
| Votes: 192,034 | Gross: $608.58 |
补充:如果用strsplit的话
要是你想用strsplit,同样需要转义|,示例代码如下:
split_list <- strsplit(votes_gross$votes_gross, "\\|") split_df <- do.call(rbind, lapply(split_list, trimws)) colnames(split_df) <- c("Votes", "Gross") split_df <- as.data.frame(split_df) # 后续同样可以用dplyr处理Gross列
内容的提问来源于stack exchange,提问作者cheklapkok
相关产品推荐
相关产品推荐

