AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78161875
Accepted
M. Beausoleil
M. Beausoleil
Asked: 2024-03-15 00:05:28 +0800 CST2024-03-15 00:05:28 +0800 CST 2024-03-15 00:05:28 +0800 CST

Extraia informações hierárquicas do cabeçalho (h2, h3, tabelas) com descanso

  • 772

Neste site https://www.quebec.ca/agriculture-environnement-et-ressources-naturelles/faune/gestion-faune-habitats-fauniques/especes-fauniques-menacees-vulnerables/liste , existem tabelas de espécies que eu gostaria de extrair.

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")

Que dá:

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

Consegui obter os cabeçalhos das seções h2, mas não consigo associá-los a cada h3seção

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"

Como então eu poderia obter o cabeçalho (por exemplo, "Liste des espèces menacées") e seus grupos (por exemplo, "Mollusques") com suas tabelas?

  • 1 1 respostas
  • 17 Views

1 respostas

  • Voted
  1. Best Answer
    margusl
    2024-03-15T03:07:14+08:002024-03-15T03:07:14+08:00

    rvesté construído sobre o xml2, portanto, conhecer alguns XPath e alguns xml2truques (um tanto não intuitivos) pode ser útil aqui. Por exemplo, podemos construir um vetor de seções que corresponda à nossa lista de elementos de tabela procurando por um <h2>elemento que precedeu cada uma dessas tabelas, basicamente usando elementos de tabela como pontos de ancoragem e retornando a árvore HTML de cada uma delas. À medida que a estrutura da página muda para a última seção, precisamos ajustar um pouco as táticas para as últimas mesas, mas a mesma estratégia ainda se aplica.

    Outra opção seria iterar cada seção (ou seja, processar apenas tabelas naquela seção específica), mas por causa dessa mudança estrutural é um pouco menos adequado aqui.

    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()
    

    Resultado:

    #> # 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
    

    Criado em 14/03/2024 com reprex v2.1.0

    • 1

relate perguntas

  • Adicionar número de série para atividade de cópia ao blob

  • A fonte dinâmica do empacotador duplica artefatos

  • Selecione linhas por grupo com 1s consecutivos

  • Lista de chamada de API de gráfico subscritoSkus estados Privilégios insuficientes enquanto os privilégios são concedidos

  • Função para criar DFs separados com base no valor da coluna

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve