R语言使用rvest提取HTML表格时如何获取单元格内超链接而非文本
解决方法
html_table() 仅能提取单元格的纯文本内容,超链接属于<a>标签的href属性,不会被该函数捕获。你需要调整采集逻辑,保留原始HTML节点才能提取链接信息,完整实现步骤如下:
1 修正采集代码,保留原始HTML对象
你之前的代码将out定义为字符向量,无法存储html_table()返回的表格数据结构,首先调整这部分逻辑:
library(rvest) library(dplyr) library(xml2) library(tidyverse) jump <- seq(1, 2, by = 1) urls <- paste('https://asbdavani.org/horse/foals/', jump, sep="") # 用列表存储每个页面的原始HTML和提取的表格文本 page_data <- vector("list", length = length(urls)) for(i in seq_along(urls)){ derby <- read_html(urls[i], encoding="UTF-8") page_data[[i]] <- list( raw_html = derby, # 取页面第一个表格,如需提取其他表格,调整[[序号]]即可,序号从1开始 table_data = derby %>% html_table(fill = TRUE) %>% .[[1]] ) } # 提取第一个页面的表格文本 first_table <- page_data[[1]]$table_data
2 提取第2、6、7列的超链接
# 定位第一个页面对应的表格节点 target_table_node <- page_data[[1]]$raw_html %>% html_element("table") # 若提取第n个表格,替换为html_elements("table")[[n]] # 计算表格总列数 total_cols <- target_table_node %>% html_elements("tr:first-child td") %>% length() # 目标列索引 target_cols <- c(2,6,7) # 批量提取目标列的超链接,无链接的单元格返回NA col_links <- lapply(target_cols, function(col_num){ # 定位该列所有单元格节点 col_cell_nodes <- target_table_node %>% html_elements("tr td") %>% .[seq(col_num, length(.), by = total_cols)] # 提取href属性 sapply(col_cell_nodes, function(cell){ a_node <- cell %>% html_element("a") if(is.na(a_node)) return(NA_character_) return(html_attr(a_node, "href")) }) }) %>% setNames(paste0("col_", target_cols, "_url")) # 将超链接合并到原表格中 first_table_with_url <- bind_cols(first_table, as.data.frame(col_links))
补充说明
- 若提取到的链接是相对路径,可通过
paste0("https://asbdavani.org", 相对路径)补全为完整可访问链接 - 若单元格内没有嵌套
<a>标签,对应结果会返回NA,方便后续过滤处理
内容的提问来源于stack exchange,提问作者Siavash
相关产品推荐
相关产品推荐

