2016-07-31 2 views
1

this topic에 이어 pems.dot.ca.gov에서 트래픽 데이터를 다운로드하려고합니다. submit과 함께 반환 된 객체에서 html 콘텐츠를 추출하는 방법

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_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'설정에 대해 어떻게 알았습니까? 정말 멋지다! Google에서이 구문을 사용하면 결과가 두 개만 반환되었습니다. 당신이 그것에 대해 알고 놀라워! – user3768495

+0

그 페이지에 테이블이 필요하다고 생각했는데 CSS 셀렉터였습니다. 웹에서 물건을 긁을 경우 CSS 선택기 또는 XPath 선택기에서 읽어야하고 브라우저 "개발자 도구"에 익숙해 져야합니다. – hrbrmstr

2

당신은이 경우에 쉽게 rvest으로 구문 분석 할 수 HTML 콘텐츠로 응답을 구문 분석 httr::content을 필요

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

관련 문제