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

如何在R中解析BGG API的XML列表与表格数据

从BGG XML API提取桌游数据的解决方案

你提到的两个核心问题可以通过xml2和rvest包高效解决,以下是具体实现:

1. 提取poll元素的属性(name、title、totalvotes)

XML元素的属性可以用xml_attr()函数直接提取,先定位到所有poll节点,再逐个获取属性:

library(xml2)
library(rvest)

# 读取API数据(修正原链接ID错误)
data <- read_xml("https://boardgamegeek.com/xmlapi/boardgame/354242")

# 获取所有poll节点
poll_nodes <- data |> xml_find_all("//poll")

# 提取每个poll的属性并整理为数据框
poll_info_df <- lapply(poll_nodes, function(node) {
  data.frame(
    name = xml_attr(node, "name"),
    title = xml_attr(node, "title"),
    totalvotes = as.integer(xml_attr(node, "totalvotes"))
  )
}) |> do.call(rbind, args = _)

print(poll_info_df)

2. 提取不同numplayers对应的投票结果

针对suggested_numplayers这个poll,定位到对应节点后,遍历每个results子节点提取玩家数和投票数据:

# 定位到"suggested_numplayers"的poll节点
player_poll <- data |> xml_find_first("//poll[@name='suggested_numplayers']")

# 获取该poll下的所有results节点
player_results <- player_poll |> xml_find_all("./results")

# 提取每个玩家数对应的投票结果并整理为数据框
player_votes_df <- lapply(player_results, function(res_node) {
  num_players <- xml_attr(res_node, "numplayers")
  result_nodes <- res_node |> xml_find_all("./result")
  
  vote_data <- lapply(result_nodes, function(result) {
    data.frame(
      vote_type = xml_attr(result, "value"),
      num_votes = as.integer(xml_attr(result, "numvotes"))
    )
  }) |> do.call(rbind, args = _)
  
  cbind(num_players = num_players, vote_data)
}) |> do.call(rbind, args = _)

print(player_votes_df)

补充:简化出版日期提取

用xml2可以更简洁地提取出版日期:

year_published <- data |> xml_find_first("//yearpublished") |> xml_text() |> as.integer()
cat("出版年份:", year_published, "\n")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:25:23