如何在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
相关产品推荐
相关产品推荐

