如何将xml_document/xml_node对象存入tibble并正常执行mutate操作
问题原因
你遇到的报错主要来自三个问题:
- 列名引用错误:你存储HTML对象的列名为
html,但提取节点时写的是不存在的page列 - CSS选择器拼写错误:目标节点ID是
#exampleApplSuppl,你代码里写成了#examleApplSuppl(少了一个字母p) - 列表列处理逻辑错误:tibble里的
html列是列表类型,每一个元素都是单独的xml_document对象,直接对整列unlist不符合逐行处理的逻辑,需要用行处理函数遍历每个元素
解决方案
有两种常用的实现方式,均支持单页/多页批量处理场景:
方式1:配合purrr::map处理列表列
因为列表列的每个元素都是独立的HTML对象,用map遍历每个对象执行节点提取操作,结果也会自动存为列表列,方便后续继续处理:
library(tidyverse) library(rvest) # 构造存储HTML的tibble works <- tibble( html = list( read_html("https://www.accessdata.fda.gov/scripts/cder/daf/index.cfm?event=overview.process&ApplNo=040445") ) ) # 用map提取节点 works <- works %>% mutate(table = map(html, ~html_nodes(.x, "#exampleApplSuppl")))
如果要进一步提取表格内容,可以继续链式调用map处理:
works <- works %>% mutate(table_content = map(table, ~html_table(.x, fill = TRUE)[[1]]))
方式2:用rowwise()逐行处理
如果不习惯map的语法,也可以先将tibble转为行处理模式,直接对每个行的html对象操作:
works <- works %>% rowwise() %>% mutate(table = list(html_nodes(html, "#exampleApplSuppl"))) %>% ungroup() # 处理完成后建议取消行模式,避免后续操作出现异常
验证结果
处理完成后可以查看提取到的节点是否正确:
works$table[[1]] # 输出会显示匹配到的table节点信息
内容的提问来源于stack exchange,提问作者ava
相关产品推荐
相关产品推荐

