如何在R中批量抓取同格式URL?循环报错问题排查
问题分析与解决
报错翻译
当前报错中文为:错误:x必须是长度为1的字符串
代码错误点及修正
1. 循环遍历对象错误
你代码里的for (realtest.Event in racename)存在变量名混乱:
- 你提到dataframe包含
realtest.Event列(应为名为realtest的dataframe里的Event列),但循环时却用了racename,导致遍历的不是目标链接列。 - 循环变量名不要和列名重复,避免混淆。
2. read_html传入参数错误
read_html()要求传入单个字符串链接,如果你遍历的不是单个链接(比如不小心传入了整个列向量),就会触发这个报错。
3. 列长度不匹配风险
bubba用html_nodes()会返回多个文本元素,而bubba2用html_node()只返回第一个元素,这会导致两列长度不一致,后续绑定行时也会报错。
修正后的代码示例
# 假设你的dataframe名叫realtest,链接列是Event res_all <- tibble() # 初始化为空tibble而非NULL,更安全 for (single_url in realtest$Event) { # 跳过空链接,避免报错 if (is.na(single_url) || nchar(single_url) == 0) next scrapinghere <- read_html(single_url) # 统一用html_nodes获取多元素,确保列长度一致 bubba <- scrapinghere %>% html_nodes("#sites-canvas-main-content td:nth-child(2)") %>% html_text() bubba2 <- scrapinghere %>% html_nodes("#sites-canvas-main-content td:nth-child(1)") %>% html_text() # 只有当两列长度一致时才添加到结果 if (length(bubba) == length(bubba2)) { putithere <- tibble(bubba, bubba2) res_all <- bind_rows(res_all, putithere) } }
额外建议
可以用purrr包的map_dfr()替代for循环,代码更简洁且不易出错:
library(purrr) scrape_single_page <- function(url) { if (is.na(url) || nchar(url) == 0) return(tibble()) scrapinghere <- read_html(url) bubba <- scrapinghere %>% html_nodes("#sites-canvas-main-content td:nth-child(2)") %>% html_text() bubba2 <- scrapinghere %>% html_nodes("#sites-canvas-main-content td:nth-child(1)") %>% html_text() if (length(bubba) == length(bubba2)) { return(tibble(bubba, bubba2)) } else { return(tibble()) } } res_all <- map_dfr(realtest$Event, scrape_single_page)
内容的提问来源于stack exchange,提问作者BurnzyBurnzy
相关产品推荐
相关产品推荐

