2016-07-31 45 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