2017-11-29 8 views
0

Versuchen, die ersten 8 Tabellen (sehr hoch, hoch, mittel, niedrig) aus dem menschlichen Entwicklungsindex in Wikipedia zu kratzen.Scraping Wikipedia Tabelle r

Begann mit, aber bekommen eine Liste von Null. Was mache ich falsch? Neu bei R :(

libray(rvest) 
url <- "https://en.wikipedia.org/wiki/List_of_countries_by_Human_Development_Index#Complete_list_of_countries" 
webpage <- read_html(url) 

hdi_tables <- html_nodes(webpage, 'table') 

head(hdi_tables, n = 10) 

scrape <- url %>% 
    read_html() %>% 
    html_nodes(xpath = '//*[@id="mw-content-text"]/div/div[5]/table/tbody/tr/td[1]/table') %>% 
    html_table() 

head(scrape, n=10) 
+1

Möglicherweise einfacher sein, die ursprünglichen Daten [von der Quelle] (http://hdr.undp.org/en/data) zu erhalten. Sie können 'HDI' auswählen und eine CSV-Datei für Jahre bis 2015 herunterladen. Die Tabellen bei Wikipedia sind Schätzungen für 2016. – neilfws

Antwort

0

Wenn Sie stattdessen mit Parsen der wikipedia Auszeichnungssprache in Ordnung sind, können Sie versuchen WikipediR verwenden könnte das Markup der Seite (von Skimming in der Dokumentation, versuchen page_content mit as_wikitext Satz auf true zu greifen .) Dann werden Sie ein paar Zeilen erhalten, die alle so aussehen:.

| 1 || {{steady}} ||style="text-align:left"| {{flag|Norway}} || 0.949 || {{increase}} 0.001 

diese parseable in R strsplit oder etwas verwenden sollte

1

ich denke, es wäre einfacher, mit derzu arbeiten 0:

Wählen Sie "Human Development Index (HDI)" in den Dropdown-Auswahllisten und klicken Sie dann auf den Link "Download Data", um eine CSV-Datei mit dem Namen Human Development Index (HDI).csv zu erhalten.

es in R Lesen:

library(tidyverse) 
Human_Development_Index_HDI_ <- read_csv("path/to/Human Development Index (HDI).csv", 
             skip = 1) 

Sie die Daten umformen können, die Werte für 2015 und klassifizieren Länder als niedrig, mittel, hoch oder sehr hoch erhalten:

hdi <- Human_Development_Index_HDI_ %>% 
    gather(Year, HDI, -`HDI Rank (2015)`, -Country) %>% 
    filter(Year == "2015") %>% 
    na.omit() %>% 
    mutate(Year = as.numeric(Year), 
     classification = cut(HDI, 
           breaks = c(0, 0.549, 0.699, 0.799, 1), 
           labels = c("low", "medium", "high", "very_high"))) 

hdi 

# A tibble: 188 x 5 
    `HDI Rank (2015)`    Country Year HDI classification 
       <int>    <chr> <dbl> <dbl>   <fctr> 
1    169   Afghanistan 2015 0.479   low 
2    75    Albania 2015 0.764   high 
3    83    Algeria 2015 0.745   high 
4    32    Andorra 2015 0.858  very_high 
5    150    Angola 2015 0.533   low 
6    62 Antigua and Barbuda 2015 0.786   high 
7    45   Argentina 2015 0.827  very_high 
8    84    Armenia 2015 0.743   high 
9     2   Australia 2015 0.939  very_high 
10    24    Austria 2015 0.893  very_high 
# ... with 178 more rows 

Sie ändern könnte der Filter, um auch Werte für 2014 zu erhalten, wenn Sie die Werte "Änderung gegenüber dem Vorjahr" in der Wikipedia-Tabelle replizieren möchten.