2016-07-31 10 views
1

this topicに続いて、pems.dot.ca.govからトラフィックデータをダウンロードしようとしています。submitで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が「セッション」で、resp_2は「応答」であり、そして続きは「生」であることがわかりました。私の質問は:どのように正しく私はこのページから必要な実際のデータを選ぶためにXPathを進めることができるようにHTMLコンテンツを正しく抽出することができますか?私の直感は、レスポンスであるresp_2を解析する必要がありますが、私はそれを動作させることができません。あなたの助けは非常に高く評価されます!

+0

Selector Gadgetを見ましたか?私はそれを抽出したいWebページの特定の部分を見つけるのに便利です。 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に渡すと、2つの結果だけが返されました!あなたがそれについて知っていることは驚くべきことです! – 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

'resp_2%>%content(as = 'text')%>%cat(これは長い単一文字列になりますので、テキストとして解析して' cat'を使用して印刷することもできます。 ) '。これはあなたが持っているものを見る良い方法ですが、あなたが望む部分を抽出するためには、デフォルトの解析済みバージョンが適しています(ただし、テキスト上で 'read_html'を呼び出すことでそれに戻ることができます)。 – alistaire

関連する問題