【问题标题】:How to convert this text (json lookalike) extracted from page to dataframe?如何将从页面中提取的文本(类似json)转换为数据框?
【发布时间】:2021-06-18 04:21:26
【问题描述】:
text <- "\n    var kml = '';\n    var PruebaTest = [\n        {\"nom\": \"MONTE GRANDE\", \"cate\": \"CO\", \"lat\": -7.22499, \"lon\": -79.15323, \"ico\": \"M\", \"cod\": \"100090\",\"cod_old\": \"000396\", \"estado\": \"DIFERIDO\"},\n{\"nom\": \"PUENTE  MAYGASBAMBA\", \"cate\": \"HLG\", \"lat\": -6.67411, \"lon\": -78.52437, \"ico\": \"H\", \"cod\": \"221110\",\"cod_old\": \"220307\", \"estado\": \"DIFERIDO\"},\n{\"nom\": \"QUEBRADA SHUGAR\", \"cate\": \"PLU\", \"lat\": -6.68778, \"lon\": -78.45694, \"ico\": \"M\", \"cod\": \"100113\",\"cod_old\": \"153108\", \"estado\": \"DIFERIDO\"},\n{\"nom\": \"CHUGUR\", \"cate\": \"PLU\", \"lat\": -6.66878, \"lon\": -78.738, \"ico\": \"M\", \"cod\": \"106077\",\"cod_old\": \"153208\", \"estado\": \"DIFERIDO\"},\n    ];\n"

我试过jsonlite::fromJSON(text),但发生了这个错误:

Error: lexical error: invalid char in json text.
                                       var kml = '';     var PruebaTes
                     (right here) ------^

您可以从中获取全文:

url <- "https://www.senamhi.gob.pe/mapas/mapa-estaciones-2/"

whole_text <- rvest::read_html(url) %>% 
  rvest::html_nodes(xpath = '//script[@type = "text/javascript"]') %>% 
  rvest::html_text()

我需要从text 中获取一个数据框

【问题讨论】:

    标签: r json web-scraping


    【解决方案1】:

    你可以这样做:

    jsonlite::fromJSON(sub("\\}[^{]+$", "}]", sub("^[^[]+", "", whole_text)))
    
                                 nom cate       lat       lon ico    cod cod_old   estado
    1                   MONTE GRANDE   CO  -7.22499 -79.15323   M 100090  000396 DIFERIDO
    2            PUENTE  MAYGASBAMBA  HLG  -6.67411 -78.52437   H 221110  220307 DIFERIDO
    3                QUEBRADA SHUGAR  PLU  -6.68778 -78.45694   M 100113  153108 DIFERIDO
    4                         CHUGUR  PLU  -6.66878 -78.73800   M 106077  153208 DIFERIDO
    5                  LA CASCARILLA   CO  -5.67175 -78.89767   M 105062  000349 DIFERIDO
    6                       CHONTALI   CO  -5.64389 -79.09000   M 105065  000250 DIFERIDO
    7                          CACAO  HLM  -5.88370 -78.96250   H 220405  220405 DIFERIDO
    8                       EL LIMON   CO  -5.91778 -79.31722   M 105057  000241 DIFERIDO
    9                HACIENDA PUCARA  PLU  -6.04167 -79.13389   M 106065  153107 DIFERIDO
    10                      SALLIQUE   CO  -5.65886 -79.31264   M 105053  002129 DIFERIDO
    

    【讨论】:

      【解决方案2】:

      你有一大块原始的 javascript 代码。这与 JSON 数据不太一样。 JSON 的数组中不能有空白元素,但可以将它们放在 javascript 文字上。您必须将代码修改为适当的形状。假设您尝试提取 PruebaTest 中的数据,您可以删除之前的所有 var 内容,并使用 gsub 删除多余的逗号

      jsonlite::fromJSON(gsub(".*?var PruebaTest =(.*?),\\s+(\\]);","\\1\\2", text))
      

      这给了

                        nom cate      lat       lon ico    cod cod_old   estado
      1        MONTE GRANDE   CO -7.22499 -79.15323   M 100090  000396 DIFERIDO
      2 PUENTE  MAYGASBAMBA  HLG -6.67411 -78.52437   H 221110  220307 DIFERIDO
      3     QUEBRADA SHUGAR  PLU -6.68778 -78.45694   M 100113  153108 DIFERIDO
      4              CHUGUR  PLU -6.66878 -78.73800   M 106077  153208 DIFERIDO
      

      但请注意,这不是通用解决方案。您需要仔细理解 javascript 代码并将其转换为正确的 JSON 结构。这对于每个 javascript 代码块应该是不同的。

      【讨论】:

      • 你知道为什么使用stringr::str_replace 不起作用吗?
      • 我添加了整个文本,因为:jsonlite::fromJSON(gsub(".*?var PruebaTest =(.*?),\\s+(\\]);","\\1\\2", text)) 不起作用。请问有什么办法吗?
      猜你喜欢
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 2021-09-01
      • 2019-08-11
      • 1970-01-01
      相关资源
      最近更新 更多