
使用rvest爬取网页时,若目标页面依赖JavaScript动态渲染(如《纽约时报》播客转录稿),直接解析HTML会丢失说话人标签;需定位<dl><dt>和<dd>结构分别提取说话人与对应语句。
使用rvest爬取网页时,若目标页面依赖javascript动态渲染(如《纽约时报》播客转录稿),直接解析html会丢失说话人标签;需定位`
- `和`
- `结构分别提取说话人与对应语句。
网页内容呈现与源码结构常存在差异——尤其当网站为无JavaScript环境(如rvest)提供降级的“noscript”版本时,原始视觉中清晰标注的“EZRA KLEIN:”“ELIZABETH WARREN:”等说话人信息,在静态HTML中并不以冒号前缀形式存在,而是被语义化地组织在定义列表(<dl>)中:<dt>(definition term)标签承载说话人姓名,<dd>(definition description)标签承载其发言内容。
因此,正确提取的关键在于识别并利用HTML语义结构,而非依赖文本模式匹配或视觉样式。以《纽约时报》播客转录页为例,其实际HTML结构如下(简化示意):
<dl class="transcript"> <dt>EZRA KLEIN</dt> <dd>Bribery can be effective as a parent. You think you’re not going to do it, and then you do.</dd> <dt>ELIZABETH WARREN</dt> <dd>Yeah.</dd> </dl>
对应R代码应改为:
library(rvest) url <- "https://www.nytimes.com/2021/05/07/podcasts/ezra-klein-podcast-elizabeth-warren-transcript.html" # 提取所有说话人(dt元素) speakers <- read_html(url) %>% html_elements("dl > dt") %>% html_text(trim = TRUE) # 提取所有发言内容(dd元素) utterances <- read_html(url) %>% html_elements("dl > dd") %>% html_text(trim = TRUE) # 组合成数据框(需确保数量一致) transcript_df <- data.frame( speaker = speakers, text = utterances, stringsAsFactors = FALSE )⚠️ 注意事项:
- dl > dt 和 dl > dd 选择器要求<dt>与<dd>为直接子元素,若页面嵌套复杂,可改用 html_elements("dl dt") 和 html_elements("dl dd") 提升容错性;
- 实际爬取前建议先用 read_html(url) %>% html_structure() 或浏览器开发者工具检查DOM结构,确认<dl>是否存在且未被CSS隐藏或JS动态注入;
- 遵守robots.txt及网站条款,对高频请求添加Sys.sleep()延时,并考虑使用httr::user_agent()设置合理UA头;
- 若<dl>结构缺失(如部分移动端或A/B测试版本),需回退至正则匹配(如^([A-Z\s]+):),但该方式鲁棒性低,仅作备用方案。
综上,结构化提取优于文本解析——理解目标站点的HTML语义设计,是稳定获取说话人-语句关联数据的核心前提。


















