2016-05-29 56 views
4

JavaScript的數據表我用R解析HTML代碼,我想知道最有效的方式,以疏下面的代碼:如何分析有R

<script type="text/javascript"> 
var utag_data = { 
    environnement : "prod", 
    device : getDevice(), 
    displaytype : getDisplay($(window).innerWidth()), 
    pagename : "adview", 
    pagetype : "annonce"}</script> 

我開始這樣做:

infos = unlist(xpathApply(page, 
          '//script[@type="text/javascript"]', 
          xmlValue)) 
infos=gsub('\n| ','',infos) 
infos=gsub("var utag_data = ","",infos) 
fromJSON(infos) 

而且上面的代碼返回財產以後很奇怪:

$nvironnemen 
[1] "prod" 

$evic 
NULL 

$isplaytyp 
NULL 

$agenam 
[1] "adview" etc. 

我想知道如何做到這一點非常efficien t方式:如何直接解析javascript中的數據列表? 謝謝。

+0

代碼正在完成其工作。它沒有錯。或者你的意思是沒有獲得'NULL'鍵設備和displaytyp? – agustin

+0

好的,事實上,我很驚訝在輸出中,環境變成了「$ nvironnemen」,我認爲這是一個錯誤。你怎麼能解釋這一點? –

回答

3

我沒有嘗試過你的代碼,但我認爲你的gsub()正則表達式可能是過分的(這可能導致名稱消失)。

它可以運行使用V8包javascript代碼,但它 將無法​​執行基於DOM的getDevice()getDisplay() 功能,因爲它們沒有在V8引擎中存在:

library(V8) 
library(rvest) 

pg <- read_html('<script type="text/javascript"> 
var utag_data = { 
    environnement : "prod", 
    device : getDevice(), 
    displaytype : getDisplay($(window).innerWidth()), 
    pagename : "adview", 
    pagetype : "annonce"}</script>') 


script <- html_text(html_nodes(pg, xpath='//script[@type="text/javascript"]')) 

ctx <- v8() 

ctx$eval(script) 
## Error: ReferenceError: getDevice is not defined 

但是,您可以補償:

# we need to remove the function calls and replace them with blanks 
# since both begin with 'getD' this is pretty easy: 
script <- gsub("getD[[:alpha:]\\(\\)\\$\\.]+,", "'',", script) 

ctx$eval(script) 
ctx$get("utag_data") 

## $environnement 
## [1] "prod" 
## 
## $device 
## [1] "" 
## 
## $displaytype 
## [1] "" 
## 
## $pagename 
## [1] "adview" 
## 
## $pagetype 
## [1] "annonce" 
+0

謝謝@hrbrmstr的幫助。我沒有嘗試評估功能,所以它是完美的!事實上,你知道爲什麼用json,「環境」變成「$ nvironnemen」嗎? –

+0

你能否也請解釋一下這個正則表達式「getD [[:alpha:] \\(\\)\\ $ \\。] +」是什麼意思?它似乎刪除「()」之前和「()」中的所有字符。你如何「讀」它?非常感謝你。 –