如何用rvest从指定网站抓取entity-app类元素生成表格?
实现思路与代码指导
核心步骤
- 遍历已抓取的每个
entity-app元素,分别提取两类目标内容 - 对每个元素,单独提取
entity-app__header__name的文本(每个APP对应唯一名称) - 提取
entity-app__info__list__header的所有文本(每个APP可能包含多个这类信息项,比如厂商、注册号等),可将多个文本合并为单个字符串 - 将所有提取结果整理为标准数据框(表格)
完整代码
library(rvest) library(purrr) # 用于遍历元素并生成数据框 # 读取页面(复用你的初始代码) document <- read_html("https://diga.bfarm.de/de/verzeichnis") html_products <- document %>% html_elements(".entity-app") # 类选择器需加.前缀才能正确匹配 # 遍历每个元素,提取目标数据并生成数据框 result_df <- html_products %>% map_dfr(function(app) { # 提取应用名称 app_name <- app %>% html_element(".entity-app__header__name") %>% html_text2() # 自动处理空白与空值 # 提取所有信息表头,合并为逗号分隔的字符串 info_headers <- app %>% html_elements(".entity-app__info__list__header") %>% html_text2() %>% paste(collapse = ", ") # 返回当前APP的结果行 tibble::tibble( 应用名称 = app_name, 信息项 = info_headers ) }) # 查看结果 print(result_df)
关键细节说明
- 类选择器修正:原代码中
html_elements("entity-app")需改为html_elements(".entity-app"),CSS类名选择器必须加.前缀才能匹配到目标元素 map_dfr的作用:自动遍历每个entity-app元素,将单个元素的提取结果合并为数据框的一行,最终生成完整表格- 空值处理:
html_text2()比html_text()更智能,会自动去除多余空白,遇到不存在的元素时返回空字符串,避免报错 - 精细化提取示例:如果需要将信息项拆分为单独列(比如厂商、注册号),可通过XPath精准定位:
result_df_detail <- html_products %>% map_dfr(function(app) { tibble::tibble( 应用名称 = app %>% html_element(".entity-app__header__name") %>% html_text2(), 厂商 = app %>% html_element(xpath = ".//*[contains(@class, 'entity-app__info__list__header') and text()='Hersteller']/following-sibling::div") %>% html_text2(), 注册号 = app %>% html_element(xpath = ".//*[contains(@class, 'entity-app__info__list__header') and text()='Eingangsnummer']/following-sibling::div") %>% html_text2() ) })
内容的提问来源于stack exchange,提问作者r tremeaud
相关产品推荐
相关产品推荐

