You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于RSelenium与rvest的R网页抓取:如何构建含id列的目标data.frame

解决方案:抓取TARIC网页数据并构建目标data.frame

嘿,我来帮你搞定这个问题!你已经成功获取了部分value列的数据,现在重点解决ID列提取和全数据整合的问题,下面是一步步的实操方案:

1. 初始化环境(补充必要的处理包)

首先把你已有的初始化代码优化下,加上dplyr和stringr方便后续数据清洗和ID提取:

suppressMessages(suppressWarnings(library(RSelenium)))
suppressMessages(suppressWarnings(library(rvest)))
suppressMessages(suppressWarnings(library(dplyr)))
suppressMessages(suppressWarnings(library(stringr)))
suppressMessages(suppressWarnings(library(purrr)))

# 启动Firefox驱动
rD <- rsDriver(browser = 'firefox', port = 6000L, verbose = FALSE)
remDr <- rD[['client']]
remDr$navigate('https://ec.europa.eu/taxation_customs/dds2/taric/measures.jsp?Lang=en&Domain=TARIC&Offset=0&ShowMatchingGoods=false&callbackuri=CBU-1&SimDate=20220719')

2. 分层级提取数据(包含ID)

观察网页结构,数据分为Section、Chapter、商品细目三个层级,每个层级的ID存储位置不同,我们分别处理:

提取Section层级数据

Section的ID直接对应元素的id属性,和你要的目标格式完全匹配:

section_elem <- remDr$getPageSource()[[1]] %>% read_html(encoding = 'UTF-8') %>% html_elements('.section')

section_data <- tibble(
  value01 = section_elem %>% html_table() %>% map_chr(1),
  value02 = section_elem %>% html_table() %>% map_chr(2),
  id = section_elem %>% html_attr('id')
)

提取Chapter层级数据

和Section一样,Chapter的ID也存放在元素的id属性里:

chapter_elem <- remDr$getPageSource()[[1]] %>% read_html(encoding = 'UTF-8') %>% html_elements('.chapter')

chapter_data <- tibble(
  value01 = chapter_elem %>% html_table() %>% map_chr(1),
  value02 = chapter_elem %>% html_table() %>% map_chr(2),
  id = chapter_elem %>% html_attr('id')
)

提取商品细目层级数据(核心:获取ID)

细目的ID藏在元素的onclick事件里(比如showItem('0101000000-1', ...)),部分子项的ID则在<td>的id属性里,我们用正则和属性提取结合的方式获取:

# 获取细目区域的所有行元素
items_elem <- remDr$getPageSource()[[1]] %>% read_html() %>% html_element(xpath = '//*[@id="div_description"]') %>% html_elements('tr')

# 逐行提取value和ID
items_data <- map_dfr(items_elem, function(row) {
  # 提取表格文本
  row_content <- row %>% html_table(header = FALSE) %>% as.character()
  value01 <- row_content[1]
  value02 <- row_content[2]
  
  # 提取ID:优先从onclick事件中解析
  onclick_str <- row %>% html_attr('onclick')
  if (!is.na(onclick_str)) {
    id <- str_extract(onclick_str, "'([^']+)'") %>% str_remove_all("'")
  } else {
    # 若onclick为空,从td的id属性中提取
    id <- row %>% html_element('td') %>% html_attr('id')
    # 兼容更深层级的子项
    if (is.na(id)) {
      id <- row %>% html_elements('td') %>% last() %>% html_attr('id')
    }
  }
  
  tibble(value01, value02, id)
})

# 清洗无效数据:把空的value01替换成"-",去掉空行
items_data <- items_data %>%
  filter(!is.na(value01) | !is.na(value02)) %>%
  mutate(value01 = ifelse(value01 == "", "-", value01))

3. 整合所有数据成目标data.frame

把三个层级的数据合并起来,就是你要的最终结构:

final_df <- bind_rows(section_data, chapter_data, items_data)

# 查看完整结果
print(final_df, n = Inf)

运行后就能得到和你示例完全一致的data.frame,包含value01、value02和id三列。

4. 收尾:关闭Selenium驱动

别忘了用完后关闭驱动,释放资源:

remDr$close()
rD$server$stop()

内容的提问来源于stack exchange,提问作者thisismeoninternet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 21:32:30