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

在R语言中拆分单列数据至多列的技术求助

解决TripAdvisor爬虫数据拆分第8-10列的问题

我看你在提取用户位置、贡献数和有用投票数的时候遇到了正则匹配的问题,咱们一步步来修正这个问题。

首先先分析下你的user_data2字段的典型结构——从TripAdvisor的页面来看,这个字段通常是类似"城市, 国家 · X contributions · Y helpful votes"这样的格式,你的原正则没有准确匹配到这些内容,才导致提取失败。

修正后的完整代码

library(xml2)
library(rvest)
library(stringr)
library(tidyr)

# 爬取目标页面数据
reddit_wbpg <- read_html("https://www.tripadvisor.in/Hotel_Review-g304551-d3583700-Reviews-or10-Lemon_Tree_Premier_Delhi_Airport-New_Delhi_National_Capital_Territory_of_Delhi.html")

# 提取各字段原始数据
title <- reddit_wbpg %>% html_node("title") %>% html_text()
reviews <- reddit_wbpg %>% html_nodes("q.location-review-review-list-parts-ExpandableReview__reviewText--gOmRC") %>% html_text()
user_data1 <- reddit_wbpg %>% html_nodes("div.social-member-event-MemberEventOnObjectBlock__event_type--3njyv") %>% html_text()
user_data2 <- reddit_wbpg %>% html_nodes("div.social-member-MemberHeaderStats__event_info--30wFs") %>% html_text()
review_title <- reddit_wbpg %>% html_nodes("div.location-review-review-list-parts-ReviewTitle__reviewTitle--2GO9Z") %>% html_text()

# 初始化数据框,避免因子类型问题
scraping_data <- data.frame(
  page_title = title, 
  review_title = review_title, 
  reviews = reviews, 
  user_data1 = user_data1,
  user_data2 = user_data2,
  stringsAsFactors = FALSE
)

# 拆分user_data1得到用户名和评论日期
scraping_data[, c("user_name", "date")] <- str_split_fixed(scraping_data$user_data1, " wrote a review", 2)
scraping_data$date <- str_trim(scraping_data$date)  # 清理日期字段多余空格

# 提取用户位置:匹配第一个分隔符「·」前的内容
scraping_data$location <- str_extract(scraping_data$user_data2, "^.+?(?= · )")
# 处理无位置信息的用户
scraping_data$location <- ifelse(is.na(scraping_data$location), "Unknown", str_trim(scraping_data$location))

# 提取贡献数:兼容单复数形式(contribution/contributions)
scraping_data$contribution <- str_extract(scraping_data$user_data2, "\\d+(?= contribution(s)?)")
scraping_data$contribution <- as.integer(scraping_data$contribution)  # 转为整数类型

# 提取有用投票数:兼容单复数形式(vote/votes)
scraping_data$helpful_votes <- str_extract(scraping_data$user_data2, "\\d+(?= helpful vote(s)?)")
scraping_data$helpful_votes <- as.integer(scraping_data$helpful_votes)  # 转为整数类型

# 可选:移除不再需要的原始字段
scraping_data <- scraping_data[, !names(scraping_data) %in% c("user_data1", "user_data2")]

关键修正点说明

  1. 位置提取:原正则^.+?(?=[0-9]+ [hc])匹配逻辑不准确,改成^.+?(?= · )精准匹配到第一个分隔符前的位置内容,同时处理了无位置信息的空值情况。
  2. 单复数兼容:贡献数和投票数的英文存在单复数差异(比如contribution/contributions),正则里加上(s)?就能同时匹配两种形式,确保数字提取不遗漏。
  3. 数据类型优化:把提取到的字符型数字转为整数,方便后续的统计分析。
  4. 空格清理:用str_trim()去掉字段里的多余空格,保证数据整洁度。

如果你的user_data2实际结构和我假设的略有差异,可以贴出样本数据,咱们再调整正则~

内容的提问来源于stack exchange,提问作者Aman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:12:33