You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中使用XPath爬取多路径网页:公寓房源数据提取问题

解决方案:批量提取Boligsiden公寓信息的正确姿势

问题出在你直接提取单个字段的所有节点,没有先按单个公寓的容器分组,容易出现字段错位或提取不全的情况。正确的做法是先抓取每个公寓的父容器,再在每个容器内单独提取对应字段,确保数据一一对应。

以下是修复后的完整代码:

library(rvest)
library(dplyr)
library(purrr)

# 设置请求头(避免被网站反爬拦截)
session <- html_session("https://www.boligsiden.dk", 
                        user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")

link <- "https://www.boligsiden.dk/tilsalg/ejerlejlighed?sortAscending=true&priceMin=3000000&priceMax=7000000&page=1"
page <- session %>% jump_to(link) %>% read_html()

# 抓取每个公寓的父容器节点
apartment_containers <- page %>% html_nodes("div.property-item__content")

# 遍历每个容器,提取对应字段
forsale <- map_df(apartment_containers, function(container) {
  # 提取地址
  address <- container %>% html_node("div.mr-2") %>% html_text(trim = TRUE)
  
  # 提取价格(处理千分位分隔符,转为数字)
  price_text <- container %>% html_node("span.property-price__value") %>% html_text(trim = TRUE)
  price <- as.numeric(gsub("[^0-9]", "", price_text))
  
  # 提取面积(从包含m²的节点中提取数字)
  sqm_text <- container %>% html_node(xpath = ".//div[contains(text(), 'm²')]") %>% html_text(trim = TRUE)
  sqm <- as.numeric(gsub("[^0-9,]", "", sqm_text)) %>% gsub(",", ".", .) %>% as.numeric()
  
  # 提取房间数(从包含værelser的节点中提取数字)
  rooms_text <- container %>% html_node(xpath = ".//div[contains(text(), 'værelser')]") %>% html_text(trim = TRUE)
  rooms <- as.numeric(gsub("[^0-9]", "", rooms_text))
  
  # 返回当前公寓的信息
  tibble(address, price, sqm, rooms)
})

print(forsale)

关键说明:

  1. 容器分组:通过div.property-item__content定位每个公寓的独立容器,确保每个字段都属于同一套公寓,避免错位。
  2. XPath精准匹配:用contains(text(), 'm²')和contains(text(), 'værelser')定位面积、房间数节点,解决SelectorGadget无法批量识别的问题。
  3. 数据清洗:用gsub去掉非数字字符,转换为数值类型,方便后续分析。
  4. 反爬处理:使用html_session设置浏览器User-Agent,避免被网站直接拦截。

替代思路(API接口):

如果网页结构频繁变动,可以尝试抓包找网站的API接口。打开浏览器开发者工具的Network面板,刷新页面后找XHR请求,通常能找到返回JSON格式的接口,直接解析JSON会比解析HTML更稳定。比如Boligsiden的列表数据可能来自类似/api/properties的接口,参数包含价格范围、页码等,直接请求API会更高效。

内容的提问来源于stack exchange,提问作者Anders Hess Christensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:05:49