使用R的rvest包抓取含URL链接的指定HTML表格方法咨询
保留HTML表格中链接的抓取方案(针对KEGG目标表格)
要抓取KEGG网站中标记为“Category Bacteria and Archaea”的第二个表格,同时保留Category、Source、Organism列的外部链接,原代码无法将链接与对应单元格正确匹配,以下是修正后的实现方法:
实现代码
library(rvest) library(dplyr) library(janitor) library(purrr) # 读取目标页面 item <- read_html("https://www.genome.jp/kegg/tables/br08606.html#5") # 定位到目标表格(页面第二个表格) target_table <- item %>% html_nodes("table") %>% .[[2]] # 提取表格行数据 rows <- target_table %>% html_nodes("tr") # 处理表头并标准化命名 header <- rows[[1]] %>% html_nodes("th") %>% html_text() %>% make_clean_names() # 逐行处理数据,同时提取文本与对应链接 data_with_links <- rows[-1] %>% map_dfr(function(row) { cells <- row %>% html_nodes("td") # 提取单元格显示文本 cell_text <- cells %>% html_text() %>% trimws() # 提取单元格内的链接(无链接则返回NA) cell_links <- cells %>% map_chr(function(cell) { link <- cell %>% html_node("a") %>% html_attr("href") ifelse(is.null(link), NA_character_, link) }) # 整合文本与链接,生成对应列 tibble( category = cell_text[1], category_link = cell_links[1], source = cell_text[2], source_link = cell_links[2], organism = cell_text[3], organism_link = cell_links[3], ncbi_taxon_id = cell_text[4], kegg_organism_code = cell_text[5], number_of_genes = cell_text[6] ) })
关键说明
- 代码仅针对目标表格处理,避免抓取页面其他无关链接
- 对Category、Source、Organism列分别生成对应的
category_link、source_link、organism_link列,确保链接与文本严格一一对应 - 无链接的单元格会自动填充
NA,不破坏表格原有结构
原代码问题修正
原代码中使用//td/a会抓取整个页面所有<td>内的链接,而非仅目标表格内容;且直接将所有链接存入单独一列,无法对应到具体单元格。修正后的代码通过逐行逐单元格遍历的方式,精准匹配每个单元格的文本与链接。
内容的提问来源于stack exchange,提问作者Han-Jiun Ke
相关产品推荐
相关产品推荐

