• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

HTML Parsen / Auslesen

Mitglied seit
19.05.2003
Beiträge
19.993
Reaktionen
849
Vielleicht kann mir hier jemand helfen. Ich möchte gerne von der Seite Rome2Rio die Informationen über den Preis und die Entfernung verschiedener Reisen extrahieren. Wenn möglich mit R, weil ich nichts anderes kann und sonst auch nichts anderes nutzen kann/darf.

Ich bin an sich so weit dass ich z.B. die Strecke Köln-Berlin auslesen kann, in dem ich den kompletten HTML Code von https://www.rome2rio.com/de/map/Koeln/Berlin extrahiere.

in R mache ich das z.B. so:

input<-"https://www.rome2rio.com/de/map/Koeln/Berlin"
wp<-readLines(input,encoding ="UTF-8")​

das Beste was ich zur Zeit hinbekomme ist mit dem Befehl readHTMLtable einige Elemente wie Dauer und Kosten rauszulesen, die wohl überall so struktuiert vorkommen, dass er das direkt ausliest.

wp.html<-readHTMLTable(wp)
df<-wp.html[[1]]
df$Kosten<-as.numeric(gsub("[^0-9]", "", df$Kosten))
df$Transportmittel<-stringr::str_replace_all(df$Transportmittel, c('ü' = 'ü', 'ï' = 'ie', 'ë' = 'ee', 'ä' = 'ae','ö' = 'ö',"ß"="ß"))
df​

Dann müsste ich noch gucken, dass ich nur die Reihe mit dem Zug behalte. Damit wäre ich eigentlich zufrieden, wenn mir nicht die Entfernung der Reiseoption fehlen würde.

Ich hatte gehofft, dass ich das ganze besser parsen könnte indem ich mir die Root/Children Beziehung anschaue, aber das läuft nur mäßig. Die heißen alle irgendwie $meta, $schript, $link oder so.

wp<-readLines(input,encoding ="UTF-8")
wp.Parse<-htmlParse(wp,encoding ="UTF-8")
root<-xmlRoot(wp.Parse)
xmlSApply(root,names)
children<-xmlChildren(root)
sapply(children,names)​

Sonst hilft mir wohl eher xpathApply um alle Elemente die mit "li" anfangen und enden zu extrahieren.

values<-xpathApply(wp.Parse, "//li", xmlValue)​

Dann hab ich aber auch noch ein recht hässliches Objekt mit 84 Werten über, bei dem ich umständlich extrahieren muss, was ich eigentlich möchte. Vor allem checke ich nicht, wieso ich nirgends die Entfernung vom Zug finde, obwohl das auf der Seite zu sehen ist...
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
20.339
Reaktionen
1.793
Ort
St. Gallen
Du machst doch am Ende nichts anderes als alle Code Zeilen einzulesen und simpel über die Zeilen zu gehen. Ich würde dir ja nen websocket empfehlen in .Net o.ä., würde aber natürlich von deinem R abweichen. Findest Du im Notepad++ die Entfernung im HTML file?
 
Mitglied seit
19.05.2003
Beiträge
19.993
Reaktionen
849
Jo das stimmt, ich hatte halt gehofft, dass irgendwie cleverer hinzubekommen. Ich brauche aus der Webansicht eigentlich nur den Lower und Upper Bound des Preises und die ENtfernung....

Anhang anzeigen 31952

Wie genau meinst du das mit der Entfernung? Der HTML code is je nach Start Ziel Kombination unterschiedlich lang, und ich finde z.B. die Km Entfernung für die Zugstrecke gar nicht.
 
Zuletzt bearbeitet:

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
20.339
Reaktionen
1.793
Ort
St. Gallen
Du findest es im file schon gar nicht, richtig?
Schau mal im Browser unter code anzeigen. Dort lassen sich eigentlich elemente auf der webseite auswählen und er springt zu den code zeilen im html file.
 
Mitglied seit
19.05.2003
Beiträge
19.993
Reaktionen
849
Also wenn ichs im Firefox direkt markiere und nach dem Quellcode suche öffnet er mir nen Fenster mit der Zeile
"<div class="pane-header__distance">548,2 km</div>"

Soweit so gut, die finde ich aber leider nicht im Gesamtquellcode. Wahrscheinlich hat das damit zu tun, dass ich auf den von mir gepostete Screen komme, wenn ich auf die Details der Zugverbindung gehe. Leider ändert sich aber die für mich sichtbare URL nicht.

das ist dann Teil von
class="mapview-page singlehopview not-logged-in no-touch rightrailwide rightrailadx state-segment page-search"
 
Mitglied seit
19.05.2003
Beiträge
19.993
Reaktionen
849
Ach ja da hab ich noch ein kleines Problem mit meiner IT, dass ich die Sachen nicht direkt einlesen kann und immer über dieses readLines gehen musst... Das muss ich noch klären

Ich bekomme leider beim einlesen
lego_movie <- read_html("http://www.imdb.com/title/tt1490017/")
Error in open.connection(x, "rb") : Could not resolve host: www.imdb.com

Ok work around gefunden... muss erst das ganze html document runterladne und dann einlesen 8(

So dann guck ich mal ob ich mit rvest weiterkomme und die Entfernung finde.
 
Zuletzt bearbeitet:
Mitglied seit
21.09.2001
Beiträge
3.435
Reaktionen
2.007
Noch nen kleiner hint, gibt auch webservices die das crawlen fuer dich übernehmen. die sind oft inner dev option kostenlos, hast dafür dann nur limitierte aufrufe... hatte nen bestimmten service im kopf der dir ne website als json zurück gibt, abern auf die schnelle nicht gefunden. dafür dann den hier ggf hilfts: https://www.apify.com/pricing
 
Oben