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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:23:00