在这个网站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")及其团体(例如,"软体动物")与他们的桌子?

推荐答案

rvest是建立在xml2之上的,所以知道一些XPath和一些(有点不直观的)xml2技巧在这里是很方便的.例如,我们可以通过搜索每个表之前的<h2>元素来构建一个与表元素列表相匹配的节向量,基本上是使用表元素作为锚点,并从每个表元素返回HTML树.随着最后一节页面 struct 的变化,我们需要对最后几个表的策略进行一些调整,但同样的策略仍然适用.

另一种 Select 是遍历每个部分(即只处理特定部分中的表),但由于 struct 上的变化,这里不太合适.

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
# some will be missing (NA), but the resulting vector still
# aligns with table element list
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

R相关问答推荐

R中的枢轴/转置

在ggplot的注释表格中突出显示最大值

MCMC和零事件二元逻辑回归

将嵌套列表子集化为嵌套列表

比较理论阿尔法和经验阿尔法

如何基于两个条件从一列中提取行

在R函数中使用加号

R如何计算现有行的总和以添加新的数据行

按组计算列中1出现的间隔年数

调换行/列并将第一行(原始数据帧的第一列)提升为标题的Tidyr类似功能?

如何使这些react 表对象相互独立?

如何在ggplot2中创建多个y轴(每个变量一个)

提高圣彼得堡模拟的速度

R中的Desolve:返回的导数数错误

策略表单连接两个非常大的箭头数据集,而不会 destruct 内存使用

网络抓取NBA.com

图中显示错误 colored颜色 的图例geom_sf

如何将一列相关性转换为R中的相关性矩阵

从多行中 Select 最小值

臭虫?GradeThis::grade_this_code()在`-code-check`块中失败