2016-05-29 2 views
4

Я использую 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) 

И выше код возвращает Somthing действительно странное:

$nvironnemen 
[1] "prod" 

$evic 
NULL 

$isplaytyp 
NULL 

$agenam 
[1] "adview" etc. 

Я хотел бы знать, как сделать это очень efficien t way: как анализировать непосредственно список данных в javascript? Спасибо.

+0

Код выполняет свою работу. Ничего плохого в этом нет. Или вы имеете в виду не получать 'NULL' для клавишного устройства и displaytyp? – agustin

+0

ОК, на самом деле, я был удивлен, что в выходе, environmentnement превращается в «$ nvironnemen», я думал, что это ошибка. Как вы могли это объяснить? –

ответ

3

Я не пробовал ваш код, но я думаю, что ваши gsub() регулярные выражения могут быть чрезмерно агрессивными (что является prbly, вызывающим название munging).

Можно запустить код JavaScript с помощью в V8 пакет, но это привычка быть в состоянии выполнить 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, «environmentnement» становится «$ nvironnemen»? –

+0

Не могли бы вы также объяснить, что делает это регулярное выражение «getD [[: alpha:] \\ (\\) \\ $ \\.] +" Означает? Кажется, что все символы удаляются до «()» и в «()». Как вы его читаете? Большое спасибо. –

Смежные вопросы