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











