Kapittel 7 Fra HTML til tabell

7.1 Hente ut tabeller

For å hente ut tabeller fra en nettside, bruker vi samme struktur som tidligere, men denne gangen ordner og strukturer vi ut informasjon fra en html-node med html_table.

Her bruker vi et eksempel som har hatt praktisk betydning for seksjonen min. I editeringsprosessen på sjekk av foretaks lån fra utlandet, ble nettsiden www.nib.int brukt i blant. Dette var Nordic Bank Investment sine nettsider, og her kan man søke seg fram til registrerte lån, for så å sjekke disse beløpene opp mot det respondentene har oppgitt i skjema.

Prosessen ser slik ut:

  1. Gå inn på www.nib.int.
  2. Trykk deg inn på “what we offer”.
  3. Trykk på “agreed loans”.
  4. Trykk på drop-down menyen “Country” og velg “Norway”.

Lenken man står igjen med ser slik ut: https://www.nib.int/what_we_offer/agreed_loans?year=all&country%5B%5D=Norway&client_name=&Search=Search

  1. Scroll ned til tabellen under og arbeid deg gjennom foretaksnavnene.

Denne prosessen kan vi automatisere med webscraping.

nibnett <- read_html("https://www.nib.int/what_we_offer/agreed_loans?year=all&country%5B%5D=Norway&client_name=&Search=Search")

nibnett_table <- nibnett %>%
  html_nodes("table")

nib_lan <- nibnett_table %>%
  html_table()

table <- nib_lan[[2]]

table
##           Date                                             Customer
## 1  20 May 2020        Møller Eiendom Holding AS\n\t\t\t\t\t(Norway)
## 2   1 Apr 2020              Bane NOR Eiendom AS\n\t\t\t\t\t(Norway)
## 3  11 Mar 2020                  SpareBank 1 SMN\n\t\t\t\t\t(Norway)
## 4  21 Jan 2020                  Agder Energi AS\n\t\t\t\t\t(Norway)
## 5  30 Dec 2019 Nedre Romerike Avløpsselskap IKS\n\t\t\t\t\t(Norway)
## 6  30 Dec 2019      Nedre Romerike Vannverk IKS\n\t\t\t\t\t(Norway)
## 7  19 Dec 2019               Pelagia Holding AS\n\t\t\t\t\t(Norway)
## 8  13 Dec 2019                Eidsiva Energi AS\n\t\t\t\t\t(Norway)
## 9   3 Dec 2019                       Fjord1 ASA\n\t\t\t\t\t(Norway)
## 10 28 Nov 2019       Sogn og Fjordane Energi AS\n\t\t\t\t\t(Norway)
##                                    Focus area
## 1                     Industries and services
## 2  Infrastructure, transportation and telecom
## 3             Financial institutions and SMEs
## 4                            Energy and water
## 5                            Energy and water
## 6                            Energy and water
## 7                     Industries and services
## 8                            Energy and water
## 9  Infrastructure, transportation and telecom
## 10                           Energy and water
##                                                                                           Loan agreed
## 1                                                                                    EUR 64.5 million
## 2   EUR 88.52 million\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tEnvironmental bond financing
## 3                                                                                    EUR 96.6 million
## 4  EUR 59.39  million\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tEnvironmental bond financing
## 5                                      EUR 54.19 million\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tClimate: 100%
## 6                                                                                  EUR 46.64  million
## 7                                                                                   EUR 14.94 million
## 8                                                                                   EUR 79.19 million
## 9    EUR 73.8 million\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tEnvironmental bond financing
## 10     EUR 30 million\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tEnvironmental bond financing
##                                                                                                                                      Summary
## 1                                                                                                              Green office building in Oslo
## 2                                                                         Renewing and refurbishing railway maintenance facilities in Norway
## 3                                                                 Loan programme for onlending to SMEs and environmental projects in Norway.
## 4  Renewing hydropower facilities and installing an additional turbine in Agder, Norway \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCategory A project
## 5                           Upgrading of a wastewater treatment plant to improve capacity and biogas production in southern Romerike, Norway
## 6                               Upgrading infrastructure to improve the capacity and security of drinking water in southern Romerike, Norway
## 7                                                       Refinancing of the acquisition of Norwegian food supplement producer Epax Norway AS.
## 8                                                                                   Modernising an electrical distribution network in Norway
## 9                                                                                             Acquisition of twelve hybrid electric ferries.
## 10                                                                               Construction of a 47MW hydropower plant in Østerbø, Norway.
##      
## 1  NA
## 2  NA
## 3  NA
## 4  NA
## 5  NA
## 6  NA
## 7  NA
## 8  NA
## 9  NA
## 10 NA

All koden i én pipe:

table <- read_html("https://www.nib.int/what_we_offer/agreed_loans?year=all&country%5B%5D=Norway&client_name=&Search=Search") %>%
  html_nodes("table") %>%
  html_table() %>%
  .[[2]]

Deretter kan vi lagre tabellen i excel.

openxlsx::write.xlsx(table, file = "./nib_lan.xlsx")

7.2 Oppgave 2

  • Gå inn på www.yr.no
  • Finn HTML-strukturen på websiden.
  • Finn den noden i HTML-koden som viser til tabellen som viser været tre dager frem.
  • Hent ut denne tabellen til R.
  • Lagre tabellen i en excel-fil.

7.3 Rydde i tabellen

Selv om vi hentet inn tabellen fra nettsiden, betyr ikke det at den er pen og fin fra starten av. Det er mange formateringsfeil underveis i tabellen. Under ser vi et eksempel på en ryddeprosess som ender opp i et plot. Vi bruker både string-pakken og regex for å gjøre dette, samt mange tidyverse-operasjoner.

table %>%
  colnames() # Hente ut navnene på kolonnene. 
## [1] "Date"        "Customer"    "Focus area"  "Loan agreed" "Summary"    
## [6] ""
table <- table %>%
  select(-"") # Tar bort kolonnen som ikke har noe navn, altså kun indikert med "".

table <- table %>%
  mutate(Customer = str_replace(Customer, "\n\t\t\t\t\t", " ")) # Endrer "Customer"-variabelen slik at vi tar bort HTML-kode som her indikerer linjeskift (\n) og masse whitespace (\t).

table <- table %>%
  mutate(`Loan agreed` = str_extract(`Loan agreed`, "[0-9]+(\\.)?([0-9]+)?")) %>% # Endrer "Loan agreed"-variabelen slik at vi bare henter ut tallene. Disse kan være med punktum og flere tall bak. Derfor regex: tall [0-9] eller flere +, potensielt ()? fulgt av punktum \\., og deretter potensielt ()? nye tall [0-9] eller flere +.
  mutate(`Loan agreed` = str_trim(`Loan agreed`)) # Vi tar bort whitespace fra variabelen.

str_length(table$`Loan agreed`) # Hvor mange tall er i hver verdi på "Loan agreed" variabelen?
##  [1] 4 5 4 5 5 5 5 5 4 2
table <- table %>% # Legger inn nuller for å få hele tall, ikke tall oppgitt i millioner. Dersom tallet har 5 objekter, skal det på fire nuller, osv.
  mutate(`Loan agreed` = ifelse(str_length(`Loan agreed`) == 5, str_c(`Loan agreed`, "0000"),
                                ifelse(str_length(`Loan agreed`) == 4, str_c(`Loan agreed`, "00000"),
                                       ifelse(str_length(`Loan agreed`) == 2, str_c(`Loan agreed`, "000000"),
                                              NA)))) %>%
  mutate(`Loan agreed` = str_remove(`Loan agreed`, "\\.")) %>% # Tar bort punktum fra tallet.
  mutate(`Loan agreed` = as.numeric(`Loan agreed`)) %>% # Gjør om tallet til numerisk verdi.
  mutate(`Loan agreed` = `Loan agreed`*12) # Ganger med 12 for å få pris i norske kroner.

table %>% # Lager en tabell med foretak og hvor mye lån de har fått farget etter fokusområde. 
  ggplot(aes(Customer, `Loan agreed`, fill = `Focus area`)) +
  geom_bar(stat = "identity") +
  coord_flip() + 
  theme_light() +
  theme(legend.position = "bottom")