2016-02-27 101 views
1

我想刮掉並分析when2meet表的輸入。從GroupGrid中刮取數據

這裏的一個示例:http://www.when2meet.com/?4474391-IBuBA

preview

表給出了各組成員的可用性的快速視覺概觀;我想提取這個給R來做一些分析,但是我會做得很少。

很短,實際上;我只提取主要頁面元素。輸出(對我來說)是亂碼:

library(rvest) 

url <- "http://www.when2meet.com/?4474391-IBuBA" 

grid <- html(url) %>% html_nodes(xpath = '//*[@id="GroupGrid"]') 

grid看起來是這樣的:

<div style="font-size:0px;vertical-align:top;"><div id="GroupTime279816300" onmouseover="ShowSlot(279816300);" style="vertical-align:top;display:inline-block;*display:inline;zoom:1;width:44px;height:9px;font-size:0px;border-left: 1px black solid;background: #c5e2b6;"><script><![CDATA[ 
Col[TimeOfSlot.indexOf(279816300)] = 0; 
Row[TimeOfSlot.indexOf(279816300)] = 23; 
]]></script></div> 
<div id="GroupTime279902700" onmouseover="ShowSlot(279902700);" style="vertical-align:top;display:inline-block;*display:inline;zoom:1;width:44px;height:9px;font-size:0px;border-left: 1px black solid;background: #8ac56d;"><script><![CDATA[ 
Col[TimeOfSlot.indexOf(279902700)] = 1; 
Row[TimeOfSlot.indexOf(279902700)] = 23; 
]]></script></div> 
<div id="GroupTime279989100" onmouseover="ShowSlot(279989100);" style="vertical-align:top;display:inline-block;*display:inline;zoom:1;width:44px;height:9px;font-size:0px;border-left: 1px black solid;background: #c5e2b6;"><script><![CDATA[ 
Col[TimeOfSlot.indexOf(279989100)] = 2; 
Row[TimeOfSlot.indexOf(279989100)] = 23; 
]]></script> 

我基本上什麼也看不見使用我在這裏;它可能是烏爾都語。而且我無法在Google或SO上找到任何關於刮取GroupGrid表格的信息。

有沒有人有任何想法如何進行?

理想情況下,我不得不形式的輸出data.tabledata.frame,如果必須):

output 
#  id slot available 
# 1: user_1 M 9:00  TRUE 
# 2: user_1 T 9:30  FALSE 
# 3: user_1 W 10:00  TRUE 
# 4: user_1 R 10:30  TRUE 
# 5: user_2 M 9:00  TRUE 
# 6: user_2 T 9:30  FALSE 
# 7: user_2 W 10:00  TRUE 
# 8: user_2 R 10:30  FALSE 

(該slot列的精確格式並不重要,也不需要是一個列 - 可以,如果容易,是daytime

回答

2

你可以做這樣的

library(data.table) 

script <- html("http://www.when2meet.com/?4474391-IBuBA") %>% 
    html_nodes("script:contains('PeopleNames')") %>% html_text() 

f <- function(regex) { 
    m <- regmatches(script, gregexpr(regex, script))[[1]] 
    #faster than transposing with `t` 
    setDT(transpose(lapply(regmatches(m, regexec(regex, m)), "[", -1)))[] 
} 
slots <- f("TimeOfSlot\\[(\\d+)\\]=(\\d+);") 
users <- f("PeopleNames\\[(\\d+)\\] = '([^']+)';PeopleIDs\\[\\d+\\] = (\\d+);") 
avails <- f("AvailableAtSlot\\[(\\d+)]\\.push\\((\\d+)\\);") 

DT <- melt(dcast(avails, V2~V1, 
       fun.aggregate = function(x) length(x) > 0, 
       value.var = "V2"), id.vars = "V2", 
      variable.name = "timeslot", value.name = "available") 

DT[users, id := i.V2, on = c(V2 = "V3")] 
DT[slots, time := format(as.POSIXct(as.integer(
    i.V2), origin = "1970-01-01", tz = "GMT"), "%a %H:%M"), 
    on = c(timeslot = "V1")] 

DT[ , c("V2", "timeslot") := NULL] 

DT[time == "Mon 11:00" & available] 
# available  id  time 
# 1:  TRUE user_1 Mon 11:00 
# 2:  TRUE user_2 Mon 11:00 
# 3:  TRUE user_3 Mon 11:00 
# 4:  TRUE user_4 Mon 11:00 
# 5:  TRUE user_5 Mon 11:00 
# 6:  TRUE user_7 Mon 11:00 
# 7:  TRUE user_10 Mon 11:00 

DT[time == "Mon 11:00" & !available] 
# available  id  time 
# 1:  FALSE user_6 Mon 11:00 
# 2:  FALSE user_8 Mon 11:00 
# 3:  FALSE user_9 Mon 11:00 

enter image description here

+0

感謝您的改進屏幕截圖。我不會有機會在明天之前確認這個工作(看起來很棒!)你怎麼知道'TimeOfSlot' RHS可以轉換成'POSIXct'?你是否只是猜測和驗證起源,時區等? – MichaelChirico

+1

所有數據都在頁面的JavaScript中 - 我查找「user_1」並在那裏。是的,將時間戳轉換爲日期時間對象是試錯法(默認情況下,CET,提前一個小時,因此我明確設置了GMT;起源是一個常見起源,所以這是我的第一次猜測)。截圖顯示「Mon,11 am」的結果與「subset」的輸出相匹配。 :-) – lukeA

+1

太棒了! 'regexec'部分特別漂亮。謝謝。我編輯了更多我的風格(我相信加快速度) – MichaelChirico