You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言网页爬虫结果与原CSV行数不匹配无法合并如何解决?

问题原因

你提前过滤了爬取结果fox_url_xml4中的NA值,得到的nan_fox_url_xml4仅保留了884个有效爬取结果,后续提取得到的文本自然也只有884条,和887行的fox_data行数不匹配,赋值时触发长度校验错误。

修正方案

核心逻辑是不要提前删除爬取失败的NA结果,直接对全部887条爬取结果执行文本提取。你编写的textScraper4Fox函数本身遇到异常就会返回NA,刚好对应爬取失败的行,最终得到的文本结果长度和原数据集完全一致,可直接赋值。

调整后完整代码
fox_data <- news_data %>% filter(media_name  == "Fox News")
fox_urls <- fox_data[,4]
fox_url_xml4 <- apply(fox_urls, 1, readUrl) 

textScraper4Fox <- function(x) {
  out <- tryCatch({
    html_text(html_nodes (x, ".article-body")) %>% 
        str_replace_all("\n", "") %>%
        str_replace_all("\t", "") %>%
        paste(collapse = '')
    }, error=function(cond) {
            message("=====================================")
            message(paste("Error Occured :", x))
            message(cond)
            message("=====================================")
            return(NA)
    }
  )
  return(out)
}

# 直接对全部爬取结果提取文本,不要提前过滤NA
# 加unlist是将列表转为字符向量,若要保留列表格式可删除该段
fox_article_text <- lapply(fox_url_xml4, textScraper4Fox) %>% unlist()

# 此时长度和原数据匹配,可直接赋值
fox_data$full_article <- fox_article_text
可选优化写法(更符合tidyverse风格)

可将步骤合并为链式操作,逻辑更清晰:

textScraper4Fox <- function(x) {
  out <- tryCatch({
    html_text(html_nodes (x, ".article-body")) %>% 
        str_replace_all("\n|\t", "") %>%
        paste(collapse = '')
    }, error=function(cond) {
            message("=====================================")
            message(paste("Error Occured :", x))
            message(cond)
            message("=====================================")
            return(NA)
    }
  )
  return(out)
}

fox_data <- news_data %>% 
  filter(media_name  == "Fox News") %>%
  mutate(
    url_xml = apply(.[,4], 1, readUrl),
    full_article = lapply(url_xml, textScraper4Fox) %>% unlist()
  )

内容的提问来源于stack exchange,提问作者monete。

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:36:09