R中使用rvest按contains规则筛选HTML页脚链接的实现方法
解决方案
你之前的代码无法精准筛选的核心原因是跨层级选择元素时跳过了带分类标识的中间父节点:页脚三个分类下的链接class完全一致,直接抓取最内层链接元素会把所有分类内容混在一起。正确逻辑是先通过文本匹配锁定目标分类的父级容器,再在容器内部提取链接,rvest支持XPath语法的contains()文本匹配,刚好适配你前缀固定、地名动态变化的需求。
单分类精准提取代码
以下代码可以直接提取Viviendas en分类下的所有房源链接,返回结构化的文本和链接地址:
library(rvest) library(dplyr) # 读取目标页面 webpage <- "https://www.fotocasa.es/es/comprar/viviendas/badalona/todas-las-zonas/l" %>% read_html() # 配置目标分类前缀,按需修改即可 target_prefix <- "Viviendas en" # 通过XPath匹配对应分类的父容器,再提取内部链接 badalona_viviendas_links <- webpage %>% html_elements(xpath = sprintf( "//div[contains(@class, 'sui-MoleculeCollapsible') and .//*[contains(@class, 'sui-MoleculeCollapsible-header-title') and contains(text(), '%s')]]", target_prefix )) %>% html_elements(".sui-LinkBasic") %>% { tibble( 链接文本 = html_text2(.), 链接地址 = html_attr(., "href") ) }
运行后返回的结果就是你列出的Badalona各片区售房链接,不会混入其他分类内容。
三分类批量提取方案
如果需要同时提取三个分类的内容并做好分类标记,直接遍历前缀列表即可,不需要调整选择器逻辑:
# 配置所有需要匹配的分类前缀 prefix_list <- c( "Encuentra más inmuebles en", "Viviendas cerca de", "Viviendas en" ) # 批量提取所有分类链接并打标 all_footer_links <- lapply(prefix_list, function(prefix){ webpage %>% html_elements(xpath = sprintf( "//div[contains(@class, 'sui-MoleculeCollapsible') and .//*[contains(@class, 'sui-MoleculeCollapsible-header-title') and contains(text(), '%s')]]", prefix )) %>% html_elements(".sui-LinkBasic") %>% { tibble( 所属分类 = prefix, 链接文本 = html_text2(.), 链接地址 = html_attr(., "href") ) } }) %>% bind_rows()
注意事项
- 该方案完全基于前缀匹配,不需要写死城市/片区名称,切换到其他城市的fotocasa页面也能正常运行
- 目标网站页脚为静态渲染内容,直接用
read_html()即可抓取,不需要调用动态渲染工具 - 如果出现匹配为空的情况,先在浏览器开发者工具中确认分类标题的class名称是否有调整,替换XPath中对应的class值即可
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

