2016-07-31 28 views
1

Ich versuche, einige Verkehrsdaten von pems.dot.ca.gov herunterladen, nach this topic.Mit rvest, wie HTML-Inhalte aus dem Objekt extrahieren von submit_form()

rm(list=ls()) 
library(rvest) 
library(xml2) 
library(httr) 
url <- "http://pems.dot.ca.gov/?report_form=1&dnode=tmgs&content=tmg_volumes&tab=tmg_vol_ts&export=&tmg_station_id=74250&s_time_id=1369094400&s_time_id_f=05%2F21%2F2013&e_time_id=1371772740&e_time_id_f=06%2F20%2F2013&tod=all&tod_from=0&tod_to=0&dow_5=on&dow_6=on&tmg_sub_id=all&q=obs_flow&gn=hour&html.x=34&html.y=8" 
pgsession <- html_session(url) 
pgform <-html_form(pgsession)[[1]] 
filled_form <- set_values(pgform, 
          'username' = 'omitted', 
          'password' = 'omitted') 
resp = submit_form(pgsession, filled_form) 
resp_2 = resp$response 
cont = resp_2$content 

überprüfte ich die class() dieser Elemente und stellte fest, dass die bzw. eine ‚Sitzung‘ ist, resp_2 ist eine ‚Antwort‘, und cont ist ‚raw‘. Meine Frage ist: Wie kann ich den HTML-Inhalt richtig extrahieren, so dass ich mit XPath fortfahren kann, um die tatsächlichen Daten auszuwählen, die ich von dieser Seite haben möchte? Meine Intuition ist, dass ich das resp_2 analysieren sollte, was eine Antwort ist, aber ich kann es einfach nicht funktionieren lassen. Ihre Hilfe wird sehr geschätzt!

+0

Haben Sie Selector Gadget angeschaut? Ich finde es nützlich, um bestimmte Teile einer Webseite zu finden, die ich extrahieren möchte. http://selectorgadget.com/. Es funktioniert gut mit 'html_nodes' und' html_text' in 'rvest' – Warner

+0

Ich habe gerade in das Gadget geschaut und es scheint cool. Aber meine Frage ist nicht, wie man Zeug aus HTML auswählt, es geht darum, wie man die Antwort oder das Raw in HTML umwandelt. Danke für deine Antwort trotzdem! – user3768495

+0

Es scheint, dass die Site einen Benutzernamen und ein Passwort benötigt, um über den Eröffnungsbildschirm zu gelangen. Sie Code-Code oben verwendet "ausgelassen", die keine gültige Kombination ist. Wenn Sie ein Beispiel für die aktuelle Seite, an der Sie interessiert sind, veröffentlichen können, wäre es hilfreicher. – Dave2e

Antwort

2

Dies sollte es tun:

pg <- content(resp$response) 

html_nodes(pg, "table.inlayTable") %>% 
    html_table() -> tab 

head(tab[[1]]) 
##     X1  X2   X3   X4 
## 1       Data Quality Data Quality 
## 2    Hour 8 Lanes % Observed % Estimated 
## 3 05/24/2013 00:00 1,311   50   0 
## 4 05/24/2013 01:00  729   50   0 
## 5 05/24/2013 02:00  399   50   0 
## 6 05/24/2013 03:00  487   50   0 

(Sie muss natürlich die Spaltennamen ändern)

+0

Genau das brauche ich! Vielen Dank @hrbrmstr, um diese Frage zu beantworten und Ihre eigenen Zugangsdaten zu erhalten :) – user3768495

+0

Woher wussten Sie die Einstellung 'table.inlayTable'? Es ist wirklich cool! Wenn ich diesen Satz google, wurden nur zwei Ergebnisse zurückgegeben! Erstaunlich, dass du davon weißt! – user3768495

+0

Ich vermutete, dass Sie die Tabelle auf dieser Seite benötigten, und das ist der CSS-Selektor dafür. Wenn Sie Dinge aus dem Internet entfernen möchten, müssen Sie entweder CSS-Selektoren oder XPath-Selektoren lesen und sich mit den "Developer Tools" des Browsers vertraut machen. – hrbrmstr

2

Sie benötigen httr::content, die eine Antwort in Inhalt analysiert, die in diesem Fall HTML ist, die leicht mit rvest analysiert werden kann:

resp_2 %>% content() 
## {xml_document} 
## <html style="height: 100%"> 
## [1] <head>\n <!-- public -->\n <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/  ## ... 
## [2] <body class="yui-skin-sam public">\n <div id="maincontainer" style="height: 100%">\n\n  \n\  ## ... 
+0

Hi @alistaire, ich denke, das ist was ich brauche. Vielen Dank! Wie drucke ich den gesamten Abschnitt auf die Konsole, damit ich ihn genauer betrachten kann? – user3768495

+0

'ernte :: html_structure' kann Ihnen einen schnellen Blick auf das DOM geben, wenn Sie brauchen. – alistaire

+0

Sie können auch als Text analysieren und 'cat' verwenden, um zu drucken (da es sich um eine lange einzelne Zeichenfolge handelt, wird die Standard-Druckmethode abgeschnitten):' resp_2%>% content (as = 'text')%>% cat () '. Während das eine gute Möglichkeit ist, um zu sehen, was Sie haben, ist die voreingestellte geparste Version besser zum Extrahieren der Teile, die Sie wollen (obwohl Sie zurückkommen könnten, indem Sie 'read_html' für den Text aufrufen). – alistaire