如何用R解析javascript数据列表

如何用R解析javascript数据列表,javascript,r,web-scraping,Javascript,R,Web Scraping,我使用R解析html代码,我想知道稀疏以下代码的最有效方法: <script type="text/javascript"> var utag_data = { environnement : "prod", device : getDevice(), displaytype : getDisplay($(window).innerWidth()), pagename : "adview", pagetype : "annonce"}</script>

我使用R解析html代码,我想知道稀疏以下代码的最有效方法:

<script type="text/javascript">
var utag_data = {
  environnement : "prod",
  device : getDevice(),
  displaytype : getDisplay($(window).innerWidth()),
  pagename : "adview",
  pagetype : "annonce"}</script>
上面的代码返回了一些非常奇怪的东西:

$nvironnemen
[1] "prod"

$evic
NULL

$isplaytyp
NULL

$agenam
[1] "adview" etc.
我想知道如何以一种非常有效的方式完成这项工作:如何直接解析javascript中的数据列表?
谢谢。

我没有试过你的代码,但我认为你的
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
库(V8)
图书馆(rvest)

pg代码正在执行它的工作。没什么问题。或者你的意思是没有为设备和显示类型的键获取
NULL
?好的,事实上,我很惊讶在输出中,Environment被转换为“$nvironnemen”,我认为这是一个bug。你怎么解释呢?谢谢@hrbrmstr的帮助。我没有尝试评估函数,所以它是完美的!事实上,你知道为什么在json中,“environment”变成了“$nvironnemen”?你能解释一下这个正则表达式“getD[[:alpha:][\(\)\$\.]+”是什么意思吗?它似乎删除了“()”之前和“()”中的所有字符。你如何“读”它?非常感谢你。
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"