如何在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
说明
- 先通过
html_node("table")精准定位页面中的表格,避免提取到其他无关的.td元素 - 单独提取表头并清理格式,确保列名准确
- 对数据行逐行处理,提取每个单元格的文本并清理空格,同时过滤掉无效行
- 最后通过
bind_rows()和set_names()将列表转换为和网页格式一致的数据框
内容的提问来源于stack exchange,提问作者cleo
相关产品推荐
相关产品推荐

