Seite 1 von 1

webscrapping Fehlermeldung

Verfasst: Di Apr 28, 2020 4:39 pm
von LeaRn
Hallo
Ich übe ein bisschen mit rvest umzugehen und bin auf folgendes Problem gestossen:

Code: Alles auswählen

library(rvest)

page <- read_html("https://www.quoka.de/alle-rubriken/kleinanzeigen.html")
    
quoka.df <- data.frame(
                      Titel = html_text(html_nodes(page, ".t-nowrap-overflow")),
                      Preis = html_text(html_nodes(page, ".price")),
                      PLZ = html_text(html_nodes(page, ".postal-code")),
                      Beschreibung = html_text(html_nodes(page, ".description")),
                      Land = html_text(html_nodes(page, ".country")),
                      Ort = html_text(html_nodes(page, ".locality"))
                     )
                     
view(quoka.df)
Ich erhalte folgende Fehlermeldung:
Fehler in data.frame(Titel = html_text(html_nodes(page, ".t-nowrap-overflow")), :
Argumente implizieren unterschiedliche Anzahl Zeilen: 28, 31
(Manchmal stehen da auch andere Werte z.B.: 28,31, 27)

Beinhalten nicht alle Class-Variablen gleich viele Werte?
Wie kann ich dies beheben?
Gruss
LeaRn

Re: webscrapping Fehlermeldung

Verfasst: Di Apr 28, 2020 8:19 pm
von EDi
Beinhalten nicht alle Class-Variablen gleich viele Werte?
Anscheinend nicht.
Wie kann ich dies beheben?
Ich würde einzeln extrahieren und fehlende vielleicht mit NA auffüllen und dann erst in einen data.frame zusammenpacken.

Es könnte aber auch sinnvoll sein, sich die Ergebnisse anzuschauen vielleicht ist da etwas für dich unerwartetes...

Re: webscrapping Fehlermeldung

Verfasst: Di Apr 28, 2020 11:11 pm
von LeaRn
Besten Dank für den Tipp! Hat mich auf die richtige Spur gebracht.
Das Problem war, dass die class von "Preis" und "Titel" auch die Preise und Titel von den Werbeangeboten beinhaltete. Diese konnten aber einfach gelöscht werden.

Hier meine Lösung:

Code: Alles auswählen

library(rvest)
library(foreach)
library(tidyr)

data <- foreach(i = 2:10, .combine = "rbind") %do% { #fügt 9 gescrapte pages von quoka.de zusammen
  
      url_split <- paste0("https://www.quoka.de/kleinanzeigen/cat_0_ct_0_page_", i)
      url <- paste0(url_split, ".html")
      
      page <- read_html(url)
          
      Titel <- html_text(html_nodes(page, ".t-nowrap-overflow"))
      Preis <- html_text(html_nodes(page, ".price"))
      PLZ <- html_text(html_nodes(page, ".postal-code"))
      Beschreibung <- html_text(html_nodes(page, ".description"))
      Land <- html_text(html_nodes(page, ".country"))
      Ort <- html_text(html_nodes(page, ".locality"))
      
      Preis[grepl("\n", Preis)] <- NA #\n sind wohl die Werbeinserate, die in denselben class gespeichert sind
      
      Beschr <- data.frame(
        Preis = Preis,
        Beschreibung = Beschreibung
      )
      
      Beschr <- drop_na(Beschr)
      
      demograph <- data.frame(
        Titel = Titel,
        PLZ = PLZ,
        Ort = Ort,
        Land = Land
      )
      quoka_frame <- cbind(Beschr, demograph)
}

colOrder <- c("Titel", "Beschreibung", "Preis", "PLZ", "Ort", "Land")
data <- data[,colOrder]

view(data)
PS.: Der Code ist eher ein Herumprobieren gewesen, als eine saubere Lösung. Verbesserungsvorschläge sind aber willkommen.