【问题标题】:Parsing a Data Table from Website That is Using JSON从使用 JSON 的网站解析数据表
【发布时间】:2017-03-03 05:39:28
【问题描述】:

我正在尝试解析来自 Minnesota DNR 页面的数据,它说他们正在使用 JSON。我想构建一个脚本来从许多不同的页面下载数据表,但我首先关注一个。我尝试了 rvest、JSONIO 和许多其他软件包,但均无济于事。我得到的最令人沮丧的错误是:

UseMethod("xml_find_first") 中的错误: 'xml_find_first' 没有适用的方法应用于“list”类的对象

这是我的代码:

library(rvest)

kk<-read_html("http://www.dnr.state.mn.us/lakefind/showreport.html?downum=56003100")

node <- "table.table_colors:nth-child(1) > tbody:nth-child(1)"

html_table(node, fill=TRUE)

head(kk)

我如何让这个表格以完整的标题下载???

【问题讨论】:

  • 我认为node应该是从html_node()返回的东西,而不是搜索字符串的文字字符串。
  • 顺便说一句,你的代码给了我一个不同的错误,而不是抱怨... applied to an object of class 'character'。您是否省略了任何相关代码?
  • 我想我确实复制了旧版本的代码。我尝试了很多不同的方法来尝试解决这个问题!我现在遇到了同样的错误。

标签: json r web-scraping rvest


【解决方案1】:

只需获取用于制作表格的实际数据即可。它是 JSON,不太复杂:

library(httr)

res <- GET("http://maps2.dnr.state.mn.us/cgi-bin/lakefinder/detail.cgi", 
           query=list(type="lake_survey", id="56003100"))

str(content(res))

这让您可以按县名获取元数据:

get_lake_metadata <- function(county_name) {

  require(httr)
  require(dplyr)
  require(jsonlite)

  xlate_df <- data_frame(
    id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
           11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 
           24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 
           37L, 38L, 39L, 40L, 41L, 42L, 44L, 45L, 46L, 43L, 47L, 48L, 49L, 
           50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 
           63L, 64L, 65L, 66L, 67L, 68L, 70L, 71L, 72L, 69L, 73L, 74L, 75L, 
           76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L), 
    county = c("Aitkin", "Anoka", "Becker", "Beltrami", "Benton", 
               "Big Stone", "Blue Earth", "Brown", "Carlton", "Carver", 
               "Cass", "Chippewa", "Chisago", "Clay", "Clearwater", "Cook", 
               "Cottonwood", "Crow Wing", "Dakota", "Dodge", "Douglas", 
               "Faribault", "Fillmore", "Freeborn", "Goodhue", "Grant", 
               "Hennepin", "Houston", "Hubbard", "Isanti", "Itasca", "Jackson", 
               "Kanabec", "Kandiyohi", "Kittson", "Koochiching", "Lac Qui Parle", 
               "Lake", "Lake of the Woods", "Le Sueur", "Lincoln", "Lyon", 
               "Mahnomen", "Marshall", "Martin", "McLeod", "Meeker", "Mille Lacs", 
               "Morrison", "Mower", "Murray", "Nicollet", "Nobles", "Norman", 
               "Olmsted", "Otter Tail", "Pennington", "Pine", "Pipestone", 
               "Polk", "Pope", "Ramsey", "Red Lake", "Redwood", "Renville", 
               "Rice", "Rock", "Roseau", "Scott", "Sherburne", "Sibley", 
               "St. Louis", "Stearns", "Steele", "Stevens", "Swift", "Todd", 
               "Traverse", "Wabasha", "Wadena", "Waseca", "Washington", 
               "Watonwan", "Wilkin", "Winona", "Wright", "Yellow Medicine"))

  target <- filter(xlate_df, tolower(county) == tolower(county_name))

  if (nrow(target) == 1) {
    res <- GET("http://maps2.dnr.state.mn.us/cgi-bin/lakefinder_json.cgi",
               query=list(county=target$id))
    jsonlite::fromJSON(content(res, as="parsed"))
  } else {
    message("County not found")
  }

}

get_lake_metadata("Anoka")
get_lake_metadata("Steele")

【讨论】:

  • 进步!!谢谢hrbrmstr!!问我如何存储湖泊 ID 以在其各个页面中搜索鱼类计数表是否太过分了?解析网站代码以提取该表仍然让我很生气。
  • 对不起,我会更清楚。该代码正在运行,但是当我使用该函数存储一个县数据时,数据格式是压倒性的。对于按物种数据表的长度,我如何判断该列在哪一列?我假设它将数据存储为数组,但不知道如何判断。
猜你喜欢
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多