2016-07-31 86 views
1

返回的對象中提取HTML內容我試圖從下面的this topic pems.dot.ca.gov下載一些流量數據。隨着Rvest,如何從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 

我檢查這些項目的class(),發現RESP是一個「會話」,resp_2是一個「響應」,並續爲「原始」。我的問題是:如何正確提取html內容,以便我可以繼續使用XPath從我的頁面中選擇我想要的實際數據?我的直覺是,我應該解析resp_2這是一個迴應,但我不能讓它工作。非常感謝您的幫助!

+0

你看過Selector Gadget嗎?我發現它對於查找我想要提取的網頁的特定部分很有用。 http://selectorgadget.com/。它可以很好地適用'rvest'內的'html_nodes'和'html_text' – Warner

+0

我只是看着小工具,它看起來很酷。但我的問題不在於如何從html中選擇內容,而是如何將響應或原始內容轉換爲html。無論如何感謝您的回答! – user3768495

+0

看來該網站需要用戶名和密碼才能通過開始屏幕。你上面的代碼使用「省略」,這不是一個有效的組合。如果您可以發佈您感興趣的實際頁面的示例,它會更有幫助。 – Dave2e

回答

2

這應做到:

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 

(你顯然需要修改列名稱)

+0

這正是我需要的!謝謝@ hrbrmstr,回答這個問題並獲取您自己的登錄憑據:) – user3768495

+0

您是如何知道'table.inlayTable'設置的?這真的很酷!當我谷歌這句話時,只有兩個結果被返回!令人驚訝的是,你知道它! – user3768495

+0

我猜你需要在該頁面上的表格,這是它的CSS選擇器。如果您要從網上刮取東西,您需要閱讀CSS選擇器或XPath選擇器,並熟悉瀏覽器「開發人員工具」 – hrbrmstr

2

你需要httr::content,它解析響應爲內容,在這種情況下是HTML,可以很容易地與rvest解析:

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

嗨@alistaire,我認爲這就是我需要的。謝謝!如何將整個部分打印到控制檯,以便我仔細看看它? – user3768495

+0

'harvest :: html_structure'可以讓你快速瀏覽DOM,如果你需要的話。 – alistaire

+0

您也可以解析爲文本並使用'cat'打印(因爲它將是一個長單個字符串,默認的打印方法將被截斷):'resp_2%>%content(as ='text')%>%cat )'。雖然這是看你有什麼好方法,但默認的解析版本更適合於提取你想要的部分(儘管你可以通過調用文本上的'read_html'回到它。 – alistaire