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:
- Gå inn på www.nib.int.
- Trykk deg inn på “what we offer”.
- Trykk på “agreed loans”.
- 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
- 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.
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.
## [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")