R - scrapowanie danych - jak oczyscic html_text

0

Ściągam dane ze strony otodom.

#instalacja biblioteki rvest
install.packages("rvest")
library(rvest)

##link z ogloszeniem
url_otodom<-'https://www.otodom.pl/oferta/nowe-mieszkanie-przy-porcie-praskim-ul-wrzesinska-ID3YoPi.html#6c436353d3'

##odczyt kodu strony
otodom<-read_html(url_otodom)

Większość interesujących mnie danych jest zapisana w formie list (znaczniki html < ul > i < li >).
Czytam je jako html_text. Czy można ewentualnie jako coś innego?

szczegoly <- otodom %>%
  html_nodes("section.section-overview") %>% html_nodes("li") %>% html_text()

Wynik jest taki:

szczegoly
 [1] "Powierzchnia: 43,18 m²"           "Liczba pokoi: 2"                  "Rynek: wtórny"                   
 [4] "Rodzaj zabudowy: apartamentowiec" "Piętro: 2"                        "Liczba pięter: 8"                
 [7] "Materiał budynku: żelbet"         "Okna: plastikowe"                 "Ogrzewanie: miejskie"            
[10] "Rok budowy: 2019"                 "Stan wykończenia: do wykończenia" "Forma własności: pełna własność" 
[13] "Dostępne od: 2019-04-12"    

Po pierwsze chciałbym je oczyścić pod późniejsze utworzenie dataframe lub table (podzielić w miejscu dwukropka, to co przed nim do header, to co po nim wartosc), ale nie wiem jak to najlepiej zrobić. Biblioteka stringr lub stringi i str_extract?

Druga sprawa jest taka, że lista zawiera 13 elementów, ale może ich być 15. Jak odczytując dopasować te co są podane do możliwych?
Chodzi o to, że różne ogłoszenia mogą mieć różne wypełnione i czytając chcę je dobrze dopasować.
Tu lista możliwych do wypełnienia przez ogłoszeniodawcę:

Powierzchnia
Liczba pokoi
Rynek
Rodzaj zabudowy
Piętro
Liczba pięter
Materiał budynku
Okna
Ogrzewanie
Rok budowy
Stan wykończenia
Czynsz
Forma własności
Dostępne od
Typ ogłoszeniodawcy

Będę wdzięczny za radę i pomoc.

0

A sprawdzales rvest::html_table?

0

Na moje oko, a nie jestem aż tak doświadczony, to w html_table można zmienić tylko obiekt, który na stronie jest tabelą.

szczegoly_tab <- otodom %>%
  html_nodes("section.section-overview") %>% html_nodes("li") %>% html_table()

** Error in html_table.xml_node(X[[i]], ...) : html_name(x) == "table" is not TRUE **

0

tak bym to zrobił (jeszcze spacje z value trza wywalić)

library(rvest)
library(dplyr)

getDfRowData <- function(url) {
  .getListData <- function(url) {
    url %>%
      read_html %>%
      html_nodes("section.section-overview") %>%
      html_nodes("li") %>%
      html_text
  }
  .listToRow <- function(list) {
    listKeyValue <- lapply(list, function(x) unlist(strsplit(x, ":")))
    keys <- unlist(lapply(listKeyValue, function(x) x[1]))
    values <- unlist(lapply(listKeyValue, function(x) x[2]))
    names(values) <- keys
    values
  }
  .unify <- function(row) {
    .names <- c("Powierzchnia", "Liczba pokoi", "Nie ma tego", "Rynek")
    row[match(.names, names(row))]
  }
  url %>%
    .getListData %>%
    .listToRow %>%
    .unify
}

url <- "https://www.otodom.pl/oferta/nowe-mieszkanie-przy-porcie-praskim-ul-wrzesinska-ID3YoPi.html#6c436353d3"
getDfRowData(url)

0

Próbowałem Twój kod bazujący na funkcjach przepisać na pętlę.
Ale niestety nie odczytuje wszystkich kluczy i wartości ze szczegółów.
Co zrobiłem źle?

#test funkcji dzielacej
podzielenie<-lapply(szczegoly,function(z) unlist(strsplit(szczegoly,": ")))
powierzchnia<-NA;liczbaPokoi<-NA;rynek<-NA;rodzajZabudowy<-NA;pietro<-NA;liczbaPieter<-NA;materialBudynku<-NA;okna<-NA;ogrzewanie<-NA;rokBudowy<-NA;stanWykonczenia<-NA;czynsz<-NA;formaWlasnosci<-NA;dostepneOd<-NA;typOgloszeniodawcy<-NA
for(i in 1:15){ #bo może być 15 różnych wartości
  klucz<-unlist(lapply(podzielenie, function(x) x[i])) #klucz to i
  wartosc<-unlist(lapply(podzielenie, function(x) x[i+1])) #wartosc to i+1 (po rozbiciu szczegolow)
  klucz
  wartosc
  if(grepl("Powierzchnia",klucz[[i]])){
  powierzchnia<-wartosc[[i]]
  }
  if(grepl("Liczba pokoi",klucz[[i]])){
    liczbaPokoi<-wartosc[[i]]
  }
  if(grepl("Rynek",klucz[[i]])){
    rynek<-wartosc[[i]]
  }
  if(grepl("Rodzaj zabudowy",klucz[[i]])){
    rodzajZabudowy<-wartosc[[i]]
  }
  if(grepl("Piętro",klucz[[i]])){
    pietro<-wartosc[[i]]
  }
  if(grepl("Liczba pięter",klucz[[i]])){
    liczbaPieter<-wartosc[[i]]
  }
  if(grepl("Material budynku",klucz[[i]])){
    materialBudynku<-wartosc[[i]]
  }
  if(grepl("Okna",klucz[[i]])){
    okna<-wartosc[[i]]
  }
  if(grepl("Ogrzewanie",klucz[[i]])){
    ogrzewanie<-wartosc[[i]]
  }
  if(grepl("Rok budowy",klucz[[i]])){
    rokBudowy<-wartosc[[i]]
  }
  if(grepl("Stan wykończenia",klucz[[i]])){
    stanWykonczenia<-wartosc[[i]]
  }
  if(grepl("Czynsz",klucz[[i]])){
    czynsz<-wartosc[[i]]
  }
  if(grepl("Forma własności",klucz[[i]])){
    formaWlasnosci<-wartosc[[i]]
  }
  if(grepl("Dostępne od",klucz[[i]])){
    dostepneOd<-wartosc[[i]]
  }
  if(grepl("Typ ogłoszeniodawcy",klucz[[i]])){
    typOgloszeniodawcy<-wartosc[[i]]
  }
}

powierzchnia, liczbaPokoi, rynek, rodzajZabudowy są odczytywane.
Ale już pozostałe (od pietro) już nie.

Jeśli zrobię ręczne przypisanie to też odczytuje.

klucz9<-unlist(lapply(podzielenie, function(x) x[9]))
wartosc9<-unlist(lapply(podzielenie, function(x) x[9+1]))

Czyli to coś z rozpoznaniem tekstu? Ale próbowałem juz i pietro (bez polskich znaków) i też nie odczytuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1