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

基于R的网页爬取:如何规整我的数据?

我懂你的困扰!现在你的代码把每篇文章的每个段落都拆成了独立行,导致数据框里条目零散,完全没法对应到单篇文章。咱们调整下循环逻辑,就能让每篇文章对应数据框里的一行,还能顺便把发布时间、文章链接这些关键信息也加上,让数据规整好用~

修改后的完整代码

# 安装并加载所需包
install.packages("rvest")
install.packages("tidyverse")
library(rvest)
library(stringr)
library(dplyr)

# 读取RSS源
apisrf <- read_xml('https://www.srf.ch/news/bnf/rss/1646')
urls_srf <- apisrf %>% html_nodes('link') %>% html_text()
zeit_srf <- apisrf %>% html_nodes('pubDate') %>% html_text()

# 初始化结构化的数据框,包含文章链接、发布时间、合并后的全文
dfsrf_articles <- data.frame(
  Article_Link = character(),
  Publish_Date = character(),
  Full_Text = character(),
  stringsAsFactors = FALSE
)

# 循环爬取每篇文章
for(i in 1:length(urls_srf)) {
  # 获取当前文章的链接和发布时间
  current_link <- urls_srf[i]
  current_date <- zeit_srf[i]
  
  # 读取文章页面
  artikel <- read_html(current_link)
  
  # 提取所有段落文本并合并成一个完整字符串(用换行分隔段落)
  full_text <- artikel %>% 
    html_nodes('p') %>% 
    html_text() %>% 
    str_c(collapse = "\n\n")  # 用两个换行保留段落间的分隔,提升可读性
  
  # 将当前文章的信息整合成一行,添加到数据框
  current_article <- data.frame(
    Article_Link = current_link,
    Publish_Date = current_date,
    Full_Text = full_text,
    stringsAsFactors = FALSE
  )
  
  dfsrf_articles <- rbind(dfsrf_articles, current_article)
}

关键改动说明

  • 初始化结构化数据框:提前定义好Article_Link、Publish_Date、Full_Text三列,避免后续数据类型混乱,也让每一行的信息更完整。
  • 合并段落文本:用str_c(..., collapse = "\n\n")把单篇文章的所有段落拼接成一个字符串,既保留了段落间的分隔,又让每篇文章对应一行。
  • 关联元数据:把每篇文章的链接和发布时间也存入数据框,后续不管是筛选还是分析都更方便。

运行后dfsrf_articles里的每一行就对应一篇完整的SRF新闻文章啦,后续加标题的话,直接从RSS里提取title节点的文本,再合并到这个数据框里就行~

内容的提问来源于stack exchange,提问作者Nico Saameli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:57:53