基于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
相关产品推荐
相关产品推荐

