基于R语言rvest包抓取网页时发言者信息丢失的问题求助
问题原因及解决方案
原因分析
纽约时报的播客实录页面里,发言者名称是通过CSS伪元素(如::before)动态渲染出来的,这类内容并不存在于原始HTML的DOM结构中,只有浏览器加载CSS后才会显示。你用rvest的read_html()只能抓取原始HTML内容,无法获取浏览器渲染生成的伪元素信息,所以发言者信息丢失,抓取结果里只留下了段落标记(如[n])。
另外,也有可能是你抓取的<p>标签本身就没有包含发言者的DOM节点——部分媒体网站会把发言者信息放在单独的元素里,或者通过隐藏属性存储,直接提取<p>的文本自然拿不到。
解决方法
方法1:提取DOM中的隐藏属性(优先推荐)
查看目标页面的HTML结构会发现,每个发言段落的<p>标签带有data-speaker属性,里面存储了发言者名称。直接提取这个属性,再结合段落文本就能关联发言者和内容:
library(rvest) library(tibble) url <- "https://www.nytimes.com/2021/05/07/podcasts/ezra-klein-podcast-elizabeth-warren-transcript.html" page <- read_html(url) # 提取发言者和对应内容 transcript <- page %>% html_elements('p[data-speaker]') %>% tibble( speaker = html_attr(., 'data-speaker'), content = html_text(.) ) print(transcript)
方法2:用浏览器自动化工具渲染页面
如果发言者信息仅存在于CSS伪元素中,没有对应的DOM属性,就需要用RSelenium模拟浏览器渲染页面,获取完整的渲染后内容再抓取:
library(RSelenium) library(rvest) library(stringr) library(dplyr) library(tibble) # 启动Chrome浏览器(需提前安装ChromeDriver并配置环境变量) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 访问目标页面 remDr$navigate("https://www.nytimes.com/2021/05/07/podcasts/ezra-klein-podcast-elizabeth-warren-transcript.html") # 获取渲染后的页面源码 page_source <- remDr$getPageSource()[[1]] page <- read_html(page_source) # 提取并拆分发言者和内容 transcript <- page %>% html_elements('p') %>% html_text() %>% str_split_fixed(":", 2) %>% as_tibble() %>% setNames(c("speaker", "content")) %>% mutate( speaker = str_trim(speaker), content = str_trim(content) ) %>% filter(speaker != "") # 关闭浏览器 remDr$close() driver$server$stop() print(transcript)
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

