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

如何在R中规整WHO新冠数据仪表盘的爬取数据?

问题描述

我正尝试从WHO Coronavirus (COVID-19) Dashboard爬取数据,使用的R代码如下:

library(tidyverse)
whole_word <-'https://covid19.who.int/table'
page_title <- read_html(whole_word)
page_title %>%
  html_nodes(".td") %>%
  html_text()
SLS_df <- tibble(Country =page_title %>%
  html_nodes('.td') %>%
  html_text()) # build the Title variable using the code we used above
SLS_df
tibble <-SLS_df[c(17:160),1]
tibble

但得到的结果不符合预期,生成的是144行1列的tibble,无法得到与网页格式一致的规整数据集,请问该如何解决这个问题?

解决方法

问题出在你直接提取所有.td元素的文本并塞进一列,忽略了表格的行结构。正确的做法是先定位表格的行,再逐行提取单元格内容,最后整理成结构化数据。

  • 第一步:定位网页中的目标表格,提取所有行(<tr>元素)
  • 第二步:对每一行提取对应的单元格(<td>元素)文本
  • 第三步:将提取到的列表转换为数据框,并设置表头

修改后的代码如下:

library(tidyverse)
library(rvest)

# 读取网页
url <- 'https://covid19.who.int/table'
page <- read_html(url)

# 定位表格,提取所有行
table_rows <- page %>% 
  html_node("table") %>%  # 找到页面中的表格元素
  html_nodes("tr")

# 提取表头
header <- table_rows %>% 
  html_nodes("th") %>% 
  html_text() %>% 
  str_trim()  # 去除多余空格

# 提取数据行内容
data_rows <- table_rows %>% 
  tail(-1) %>%  # 跳过表头行
  map(~ html_nodes(., "td") %>% html_text() %>% str_trim()) %>% 
  keep(~ length(.) == length(header))  # 过滤掉长度不匹配的行

# 转换为结构化数据框
covid_df <- data_rows %>% 
  bind_rows() %>% 
  set_names(header)

# 查看结果
covid_df

说明

  1. 先通过html_node("table")精准定位页面中的表格,避免提取到其他无关的.td元素
  2. 单独提取表头并清理格式,确保列名准确
  3. 对数据行逐行处理,提取每个单元格的文本并清理空格,同时过滤掉无效行
  4. 最后通过bind_rows()和set_names()将列表转换为和网页格式一致的数据框

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:40:24