html - 如何在 R 中获取简单的 HTML 表单?

标签 html r get rcurl rvest

我也有类似的问题。我正在尝试从美国人口普查地理编码器链接获取地址的坐标(纬度和经度)。我遵循了提到的方法here ;但是,我没有得到所需的结果。让我写下我在 3 次尝试中遵循的步骤:

尝试#1(使用RCurl):

url_geo <- "http://geocoding.geo.census.gov/geocoder/locations/address?form"
td.html <- getForm(url_geo,
submit = "Find",
street  = "3211 Providence Dr",
city = "Anchorage",
state   = "AK",
zip = "99508",
benchmark = "Public_AR_Current",
.opts = curlOptions(ssl.verifypeer = FALSE))

当我看到td.html的输出时,它与您在上述网页中“查看页面源代码”时得到的结果相同。实际上,td.html 应该包含在上述网页中提交表单后出现的结果页面的详细信息。

尝试#2(使用httr):

url_geo <- "http://geocoding.geo.census.gov/geocoder/locations/address?form"
fd1 <- list(
submit = "Find",
street  = "3211 Providence Dr",
city = "Anchorage",
state   = "AK",
zip = "99508",
benchmark = "Public_AR_Current"
)
resp1<-GET(url_geo, body=fd1, encode="form")
content(resp1)

resp1的内容与人们想象的有很大不同。

尝试#3(使用rvest):

url_geo <- "http://geocoding.geo.census.gov/geocoder/locations/address?form"
s <- html_session(url_geo)
f0 <- html_form(s)

在这里,我收到一个错误:

Error: Current page doesn't appear to be html.

请帮助我理解我做错了什么。如果您需要我的任何说明,请告诉我。

最佳答案

人口普查网站足够好,可以向您发送回 JSON(这是出乎意料的,并且执行此调用有一个不错的好处):

library(httr)
library(jsonlite)

URL <- "http://geocoding.geo.census.gov/geocoder/locations/address"

res <- GET(URL,
           query=list(street="3211 Providence Dr",
                      city="Anchorage",
                      state="AK",
                      zip="99508",
                      benchmark=4))

dat <- fromJSON(content(res, as="text"))

str(dat$result$addressMatches)
## 'data.frame': 1 obs. of  4 variables:
##  $ matchedAddress   : chr "3211 PROVIDENCE DR, ANCHORAGE, AK, 99508"
##  $ coordinates      :'data.frame':  1 obs. of  2 variables:
##   ..$ x: num -150
##   ..$ y: num 61.2
##  $ tigerLine        :'data.frame':  1 obs. of  2 variables:
##   ..$ tigerLineId: chr "638504877"
##   ..$ side       : chr "L"
##  $ addressComponents:'data.frame':  1 obs. of  12 variables:
##   ..$ fromAddress    : chr "3001"
##   ..$ toAddress      : chr "3399"
##   ..$ preQualifier   : chr ""
##   ..$ preDirection   : chr ""
##   ..$ preType        : chr ""
##   ..$ streetName     : chr "PROVIDENCE"
##   ..$ suffixType     : chr "DR"
##   ..$ suffixDirection: chr ""
##   ..$ suffixQualifier: chr ""
##   ..$ city           : chr "ANCHORAGE"
##   ..$ state          : chr "AK"
##   ..$ zip            : chr "99508"

您可以使用 fromJSONflatten 参数来处理数据帧可怕的数据结构中的那些数据帧:

dat <- fromJSON(content(res, as="text"), flatten=TRUE)
dplyr::glimpse(dat$result$addressMatches)

## Observations: 1
## Variables: 17
## $ matchedAddress                    (chr) "3211 PROVIDENCE DR, ANCHORAGE, AK, 99508"
## $ coordinates.x                     (dbl) -149.8188
## $ coordinates.y                     (dbl) 61.18985
## $ tigerLine.tigerLineId             (chr) "638504877"
## $ tigerLine.side                    (chr) "L"
## $ addressComponents.fromAddress     (chr) "3001"
## $ addressComponents.toAddress       (chr) "3399"
## $ addressComponents.preQualifier    (chr) ""
## $ addressComponents.preDirection    (chr) ""
## $ addressComponents.preType         (chr) ""
## $ addressComponents.streetName      (chr) "PROVIDENCE"
## $ addressComponents.suffixType      (chr) "DR"
## $ addressComponents.suffixDirection (chr) ""
## $ addressComponents.suffixQualifier (chr) ""
## $ addressComponents.city            (chr) "ANCHORAGE"
## $ addressComponents.state           (chr) "AK"
## $ addressComponents.zip             (chr) "99508"

这将其包装到一个函数中以便于调用:

#' Geocode address using the Census API
#'
#' @param steet Street
#' @param city City
#' @param state State
#' @param zip Zip code
#' @param benchmark "\code{current}" for this most current information,
#'        "\code{2014}" for data from the 2014 U.S. ACS survey,
#'        "\code{2010}" for data from the 2010 U.S. Census. This defaults
#'        to "\code{current}".
#' @result \code{list} of query params and response values. If successful,
#'         the geocoded values will be in \code{var$result$addressMatches}
census_geocode <- function(street, city, state, zip, benchmark="current") {

  URL <- "http://geocoding.geo.census.gov/geocoder/locations/address"

  bench <- c(`current`=4, `2014`=8, `2010`=9)[benchmark]

  res <- GET(URL,
             query=list(street=street, city=city, state=state,
                        zip=zip, benchmark=bench))

  warn_for_status(res)

  fromJSON(content(res, as="text"), flatten=TRUE)

}

census_geocode("3211 Providence Dr", "Anchorage", "AK", "99508")

关于html - 如何在 R 中获取简单的 HTML 表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34479500/

相关文章:

r - fread (data.table) 锁定文件

html - 无法使用 CSS 格式化 html 表单元素(标签和输入)

javascript - 根据值的条件更改 div 颜色

javascript - 如何打印具有原始样式的 HTML 元素?

r - 有自己的侧边栏和主面板的选项卡可以 Shiny 吗?

R-分解箱图中的群抖动?

reactjs - 在 Axios 中的 GET 方法 URL 搜索参数中发送嵌套对象

php - 为什么 POST 和 GET 方法表单不适用于 PHP?

c# - 如何以编程方式登录雅虎网站

html - 使用 CSS 指示元素组