基于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
相关产品推荐
相关产品推荐

