从标题(h2,h3,表格)中提取层次信息与休息

问题描述 投票:0回答:1

在这个网站上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”)及其表格?

r web-scraping rvest
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.