使用R爬取Craigslist:CSS选择器无法获取面积与卧室数
解决Craigslist爬取中面积和卧室数返回NA的问题
核心原因
Craigslist的HTML结构经常迭代,你用的.post-bedrooms和.post-sqft类名大概率已经被移除或替换了。目前绝大多数租房房源的卧室数、面积信息是打包放在同一个HTML元素里的,而非单独对应你用的类选择器。
验证方法
打开目标Craigslist租房页面,按F12调出开发者工具,随便找一条房源查看其户型面积对应的HTML标签:
通常会看到类似
<span class="housing">2br - 1000ft2</span>或者<div class="attrgroup"><span>2 bedrooms</span><span>1000 sqft</span></div>的结构,根本找不到.post-bedrooms或.post-sqft的类。
修正后的代码示例
用rvest配合正则表达式提取打包在.housing里的信息:
library(rvest) library(dplyr) library(stringr) # 替换成你目标城市的Craigslist租房页面URL target_url <- "https://portland.craigslist.org/search/apa" page_content <- read_html(target_url) # 提取基础信息(标题、价格) rent_data <- tibble( title = page_content %>% html_elements(".titlestring") %>% html_text(), price = page_content %>% html_elements(".price") %>% html_text() %>% parse_number() ) # 提取户型面积的原始文本 housing_raw <- page_content %>% html_elements(".housing") %>% html_text() %>% str_squish() # 从原始文本中拆分卧室数和面积 rent_data <- rent_data %>% mutate( # 处理卧室数:匹配数字+br,同时兼容Studio户型 bedrooms = case_when( str_detect(housing_raw, "Studio") ~ 0, str_detect(housing_raw, "\\d+br") ~ as.numeric(str_extract(housing_raw, "\\d+(?=br)")), TRUE ~ NA_real_ ), # 处理面积:匹配数字+ft2 sqft = str_extract(housing_raw, "\\d+(?=ft2)") %>% as.numeric() ) print(rent_data)
额外说明
- 部分房源可能未填写面积或卧室数,这类情况返回NA是正常的,并非代码问题。
- 如果你的目标页面结构和上述示例不同,再用开发者工具定位具体元素,调整
html_elements里的选择器即可。
内容的提问来源于stack exchange,提问作者Dabin Xuan
相关产品推荐
相关产品推荐

