在这个网站上https://www.quebec.ca/agriculture-environnement-et-ressources-naturelles/faune/gestion-faune-habitats-fauniques/especes-fauniques-menacees-vulnerables/liste,有以下表格我想提取的物种。
library(rvest)
sp.list = "https://www.quebec.ca/agriculture-environnement-et-ressources-naturelles/faune/gestion-faune-habitats-fauniques/especes-fauniques-menacees-vulnerables/liste"
# Get website
wp.list = read_html(species.list)
# Extract name of sections
headers = wp.list %>% html_elements("h3") %>% html_text2() %>% .[1:24]
# Get tables
tab = read_html(sp.list) %>% html_table(header = TRUE)
# Name tables
names(tab) = headers
# Combine tables
tab.gr = dplyr::bind_rows(tab, .id = "group")
这给出了:
tab.gr
# A tibble: 180 × 3
group Espèce `Nom latin`
<chr> <chr> <chr>
1 Mollusques Anodonte du gaspareau Utterbackiana implicata
2 Mollusques Obovarie olivâtre Obovaria olivaria
3 Insectes Bourdon à tache rousse Bombus affinis
4 Insectes Coccinelle à neuf points Coccinella novemnotata
我能够获取节标题
h2
,但我无法将它们与每个h3
节相关联
get.section = wp.list %>% html_nodes('.frame, .frame-default, .frame-type-textmedia, .frame-layout-0')
pas.dans.cette.page = !grepl(pattern = "Dans cette", x = get.section)
subset.listes = get.section[pas.dans.cette.page]
sections.tables = subset.listes[grep(pattern = "Liste des esp", x = subset.listes)]
sections.tables %>% html_elements("h2") %>% html_text2()
[1] "Liste des espèces menacées"
[2] "Liste des espèces vulnérables"
[3] "Liste des espèces susceptibles d’être désignées comme menacées ou vulnérables"
那么我怎样才能获得标题(例如,“Liste des espèces menacées”)及其组(例如,“Mollusques”)及其表格?
rvest
建立在 xml2
之上,因此了解一些 XPath 和一些(有点不直观)xml2
技巧在这里会很方便。例如,我们可以通过搜索每个表之前的 <h2>
元素来构建与表元素列表匹配的部分向量,基本上使用表元素作为锚点并从每个表元素返回 HTML 树。随着最后一部分的页面结构发生变化,我们需要对最后几张表的策略进行一些调整,但相同的策略仍然适用。
另一种选择是迭代每个部分(即仅处理该特定部分中的表),但由于结构变化,它在这里不太合适。
library(rvest)
library(dplyr)
library(purrr)
url_ <- "https://www.quebec.ca/agriculture-environnement-et-ressources-naturelles/faune/gestion-faune-habitats-fauniques/especes-fauniques-menacees-vulnerables/liste"
html <- read_html(url_)
# table elements
table_elements <-
html_elements(html, "table")
# for each table element, find an ancestor with h2, extract that
sections <-
html_element(table_elements, xpath = "./ancestor::div[h2]/h2") |>
html_text(trim = TRUE)
# for the last section page structure changes; for those tables, find
# ancestor that contains a class with 'frame', from there find a
# preceding sibling that includes h2
sections[is.na(sections)] <-
table_elements[is.na(sections)] |>
html_element(xpath = "./ancestor::div[contains(@class, 'frame')]/preceding-sibling::div[h2][1]/h2") |>
html_text(trim = TRUE)
# captions are included in table elements
groups_ <- html_element(table_elements, "caption") |> html_text()
# process all previuos objects in parallel
pmap(list(table_elements, sections, groups_),
\(t_, s_, g_) html_table(t_) |> mutate(section = s_, group = g_, .before = 1)) |>
list_rbind()
结果:
#> # A tibble: 180 × 4
#> section group Espèce `Nom latin`
#> <chr> <chr> <chr> <chr>
#> 1 Liste des espèces menacées Mollusques Anodonte du gaspareau Utterbackia…
#> 2 Liste des espèces menacées Mollusques Obovarie olivâtre Obovaria ol…
#> 3 Liste des espèces menacées Insectes Bourdon à tache rousse Bombus affi…
#> 4 Liste des espèces menacées Insectes Coccinelle à neuf points Coccinella …
#> 5 Liste des espèces menacées Insectes Cuivré des marais salés Lycaena dos…
#> 6 Liste des espèces menacées Insectes Satyre fauve des Maritimes Coenonympha…
#> 7 Liste des espèces menacées Poissons Chabot de profondeur Myoxocephal…
#> 8 Liste des espèces menacées Poissons Chevalier cuivré Moxostoma h…
#> 9 Liste des espèces menacées Poissons Cisco de printemps Coregonus a…
#> 10 Liste des espèces menacées Poissons Dard de sable Ammocrypta …
#> # ℹ 170 more rows
创建于 2024-03-14,使用 reprex v2.1.0