我的最终目标是使用维基百科表中的数据源绘制图表。
我使用 R/selenium。
我已成功修改其中一个单元格:
library(RSelenium)
library(wdman)
library(netstat)
selenium()
selenium_object <- selenium(retcommand = TRUE, check = F)
selenium_object
binman::list_versions("chromedriver")
#start the server
rs_driver_object <- rsDriver(browser = "chrome",
chromever = "117.0.5938.92",
verbose = F,
port = free_port())
#create a client object
remDr <- rs_driver_object$client
#open a browser
remDr$open()
remDr$navigate("https://zh.wikipedia.org/zh-hk/%E6%B2%99%E7%94%B0_(%E9%A6%99%E6%B8%AF)")
webpage_text <- remDr$getPageSource()[[1]]
tables <- getNodeSet(htmlParse(webpage_text),"//table")
df <- readHTMLTable(tables[[3]], Encoding("UTF-8"))
str_extract(df[4,2], "\\d+([.,]\\d+)?+(?<!\\()")
问题是:如何将正则表达式函数应用于一系列表格单元格?那么,如何在同一个df中获得结果呢?
我的尝试是这样的,但失败了:
celsius <- str_extract(df[4,2], "\\d+([.,]\\d+)?+(?<!\\()")
apply(df[c(2:3),c(5:8)], c(1,2), celsius)
难题是如何解决
celsius
中的字符串属性。
谢谢你。
这可以简单一点。您在这里不需要 Selenium,因为它是一个静态网站,因此您可以使用
rvest
来提取表格:
df <- read_html(url) |>
html_elements(".wikitable") |>
html_table(header = FALSE) |>
purrr::pluck(1) |>
filter(grepl("°C(°F)", X1)) |> # only temperature columns
# set month names to English for my benefit
setNames(c("month", month.abb, "annual"))
然后要提取
celsius
温度,您可以使用 tidyr::separate_wider_regex()
。
df |>
tidyr::separate_wider_regex(
cols = Jan:annual, c(c = ".+", f = "\\(.+\\)"),
names_sep = "_"
) |>
select(month, ends_with("_c"))
# # A tibble: 5 × 14
# month Jan_c Feb_c Mar_c Apr_c May_c Jun_c Jul_c Aug_c Sep_c Oct_c Nov_c Dec_c annual_c
# <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
# 1 歷史最高溫 °C(°F) 27.6 28.6 31.8 33.0 36.6 36.4 37.5 38.1 36.5 35.1 31.8 28.9 38.1
# 2 平均高溫 °C(°F) 19.3 19.8 22.1 25.7 29.0 30.8 31.9 31.9 31.1 28.5 24.9 20.9 26.3
# 3 日均氣溫 °C(°F) 15.8 16.5 19.1 22.6 26.1 28.1 28.9 28.6 27.8 25.2 21.5 17.2 23.1
# 4 平均低溫 °C(°F) 12.9 13.9 16.7 20.2 23.7 25.8 26.3 26.0 25.2 22.6 18.7 14.1 20.5
# 5 歷史最低溫 °C(°F) 2.9 4.0 4.4 10.2 15.3 19.9 21.3 22.1 19.9 14.4 6.3 4.8 2.9