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

在R中抓取维基百科表格仅能获取海拔值的问题求助

问题:维基百科信息框抓取中面积与密度数据无法填充到数据框

问题背景

尝试从维基百科页面抓取Aire-la-Ville的面积、海拔、人口密度数据,通过CSS选择器提取信息框的标签与对应数据:

  • 提取的labels中包含" • Total"(对应面积)、"Elevation"、" • Density"(对应人口密度)
  • data中存在上述标签对应的数值数据
    但填充canton_table数据框时,仅海拔数据成功写入,面积和密度数据无法正常获取。

相关代码

数据提取代码

# Get labels and data
labels <- current_html %>% html_elements(css = ".infobox-label") %>% html_text()
data <- current_html %>% html_elements(css = ".infobox-data") %>% html_text()

数据填充代码

# Clean text and store in data frame
canton_table[canton_table$name == current_name, "area"] <- helper_function(" • Total", labels, data)
canton_table[canton_table$name == current_name, "elevation"] <- helper_function("Elevation", labels, data)
canton_table[canton_table$name == current_name, "density"] <- helper_function(" • Density", labels, data)

原因分析

核心问题大概率是字符串精确匹配失败:

  • labels中的" • Total"和" • Density"可能包含隐形空白字符(如前后空格、换行符),或特殊圆点符号与传入helper_function的目标字符串不完全一致
  • 若helper_function使用==做精确匹配,细微的字符差异都会导致匹配失败,而"Elevation"没有这类特殊字符,因此匹配成功

解决方案

方案1:清理标签字符串后匹配

先对提取的labels做清洗,去除空白和特殊前缀,再用简化后的标签名匹配:

# 改进数据提取:清理标签文本
labels <- current_html %>% 
  html_elements(css = ".infobox-label") %>% 
  html_text() %>%
  stringr::str_trim() %>% # 去除字符串前后的空白字符
  stringr::str_replace_all("^•\\s+", "") # 移除开头的圆点及后续空格

# 填充数据时使用简化后的标签名
canton_table[canton_table$name == current_name, "area"] <- helper_function("Total", labels, data)
canton_table[canton_table$name == current_name, "elevation"] <- helper_function("Elevation", labels, data)
canton_table[canton_table$name == current_name, "density"] <- helper_function("Density", labels, data)

方案2:修改helper_function的匹配逻辑

如果不想修改标签提取逻辑,可调整helper_function,增加字符串清洗或使用模糊匹配:

# 改进后的helper_function:先清洗字符串再匹配
helper_function <- function(target_label, labels, data) {
  # 清洗目标标签和所有提取的标签
  target_clean <- stringr::str_trim(target_label) %>%
    stringr::str_replace_all("^•\\s+", "")
  labels_clean <- labels %>%
    stringr::str_trim() %>%
    stringr::str_replace_all("^•\\s+", "")
  
  # 查找匹配索引
  match_idx <- which(labels_clean == target_clean)
  if (length(match_idx) > 0) {
    # 返回对应的数据,可额外清洗数值格式
    return(stringr::str_trim(data[match_idx]))
  } else {
    return(NA)
  }
}

# 原填充代码无需修改
canton_table[canton_table$name == current_name, "area"] <- helper_function(" • Total", labels, data)
canton_table[canton_table$name == current_name, "elevation"] <- helper_function("Elevation", labels, data)
canton_table[canton_table$name == current_name, "density"] <- helper_function(" • Density", labels, data)

方案3:排查字符串真实内容

若上述方案无效,可先输出labels的原始结构,确认字符串的真实值:

# 输出labels的详细结构,查看是否有隐形字符
dput(labels)

根据输出结果针对性调整清洗规则(比如处理换行符、全角空格等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:05:23