R语言rvest包网页抓取div内结构化联系人信息失败求解
错误原因排查
你之前的代码无法提取地址、城市、电话字段,核心是节点选择逻辑错误:
<br>是HTML空标签,仅起换行作用,本身不包裹任何文本内容。你要的三个字段文本是直接存放在class="one_third"的父div下,不属于br标签的子内容,直接选br节点调用html_text()拿不到任何值。- 你测试选择的
bold、p标签在给出的HTML源码中不存在,自然匹配不到结果。 - 源码里存在重复的my_name_2条目,部分地址末尾带多余逗号,整理时需要做去重和标点清理。
正确提取代码
实现思路是先选中所有承载信息的div.one_third卡片节点,逐个解析卡片内的文本,按换行拆分后对应到四个字段即可,不需要单独匹配br标签:
library(rvest) library(dplyr) library(stringr) # 读取本地HTML文件 page <- read_html("my_website.html") # 提取所有信息卡片节点 cards <- page %>% html_nodes("div.one_third") # 逐卡片解析字段 result <- lapply(cards, function(card) { # 提取姓名字段,清理末尾多余的点号 name <- card %>% html_element("strong") %>% html_text() %>% str_remove("\\.$") %>% str_squish() # 提取卡片全部文本,自动按换行拆分,过滤空值和Website链接文本 text_parts <- card %>% html_text2() %>% str_split("\n") %>% unlist() %>% str_squish() %>% .[nchar(.) > 0 & . != "Website"] # 按顺序匹配地址、城市、电话,清理地址末尾多余逗号 data.frame( name = name, address = str_remove(text_parts[2], ",$"), city = text_parts[3], phone = text_parts[4] ) }) # 合并结果并去重,得到最终结构化表 final_df <- bind_rows(result) %>% distinct()
运行后final_df的输出和你预期的格式完全一致。这里用html_text2()是rvest提供的适配松散文本解析的函数,会自动按br标签、块级标签对文本做换行分割,不需要手动处理标签嵌套问题。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

