R语言rvest爬取网页时关联子标题与对应数据的方法
R爬虫rvest分块绑定子标题方案
问题背景
- 已通过
rvest包读取目标房产页面内容存入preciosComAlq对象 - 可正常提取
.t-panel.comprar板块下5个.t-panel_subtitle子标题节点,也可提取描述区块内的数值、文本字段,直接bind_cols()合并后得到12行2列无分类标记的tibble - 需求:新增
subtitle列标记每条数值-文本条目对应的子标题归属,例如「6.345 €/m² Precio con terraza」这类条目需归属到「Precio m² por características」子标题下,输出结构化数据集
实现代码
核心思路是放弃全局平级提取所有描述项的写法,以子标题节点为起点逐块提取对应下属内容,从根源避免分类错位:
library(rvest) library(tidyverse) # 先定位到买房板块的根节点 comprar_root <- preciosComAlq %>% html_element(".t-panel.comprar") # 迭代每个子标题节点,逐块提取数据并绑定子标题 result_df <- comprar_root %>% html_elements(".t-panel_subtitle") %>% map_dfr(function(sub_node){ # 提取当前子标题文本 sub_title <- sub_node %>% html_text2() # 定位当前子标题紧邻的下属描述区块(通过XPath兄弟节点轴匹配) desc_block <- sub_node %>% html_element(xpath = "following-sibling::div[contains(@class,'description-wrap')][1]") # 提取当前区块下的所有数值 metric_vals <- desc_block %>% html_elements(".description-item_semibold") %>% html_text2() # 提取当前区块下的所有描述文本 metric_text <- desc_block %>% html_elements(".description-item_regular") %>% html_text2() # 组装当前块的数据集 tibble( subtitle = sub_title, metric_value = metric_vals, metric_desc = metric_text ) })
注意事项
- 该方案通过XPath的
following-sibling轴匹配每个子标题之后第一个描述区块,严格对应网页DOM结构的从属关系,不需要手动做位置匹配,不会出现分类错配 - 统一使用
html_text2()提取文本,可自动清理网页自带的多余换行、空白字符,无需额外做文本清洗 - 若存在个别子标题下无对应描述项的场景,可在提取
desc_block后增加空值判断,避免迭代报错 - 最终输出结果行数和之前提取的12行完全一致,无数据丢失
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

