【问题标题】:using rvest to read table from web使用 rvest 从网络读取表格
【发布时间】:2018-01-15 03:29:25
【问题描述】:

我是 R 和网络抓取的新手。我正在尝试将世界银行网站上的表格读入 R。

这里以其中一个项目的 url 链接为例(我的目标是阅读“基本信息”下的左表):http://projects.worldbank.org/P156880/?lang=en&tab=details

我正在使用 Chrome 的 Dedvtools 来识别该特定表所需的选择器节点。

这是我的代码:

library(rvest)
url <- "http://projects.worldbank.org/P156880/?lang=en&tab=details"
details <- url %>% 
        read_html() %>% 
        html_nodes(css = '#projectDetails > div:nth-child(2) > div.column-left > table') %>%
        html_table()

不幸的是,我得到一个空列表:

> details
list()

任何有关如何解决此问题的帮助将不胜感激。

【问题讨论】:

  • 表格是用 JavaScript 渲染的,你需要使用 PhantomJS 或类似的东西来实际运行 underline JavaScript 并得到正确渲染的 HTML。

标签: r web-scraping rvest


【解决方案1】:

此站点使用 XML http 请求,您可以使用 httr 获取这些请求。打开 Chrome 开发者工具并转到网络选项卡,然后在上面加载您的网址。您会注意到在加载页面时请求了其他四个 url,因此单击projectdetails?,您应该会在“预览”选项卡中看到 html 表。接下来,右键单击projectdetails? 并复制为 cURL 到文本编辑器,然后将 URL、Referer 和 X-Requested-With 粘贴到下面的 httr GET 函数中。

library(httr)
library(rvest)

res <- GET(
  url = "http://projects.worldbank.org/p2e/projectdetails?projId=P156880&lang=en",
  add_headers(Referer = "http://projects.worldbank.org/P156880/?lang=en&tab=details", 
   `X-Requested-With` = "XMLHttpRequest")
)  
content(res) %>% html_node("table") %>% html_table( header=TRUE)
                Project ID                     P156880
  1                 Status                      Active
  2          Approval Date           December 14, 2017
  3           Closing Date           December 15, 2023
  4                Country                    Colombia
  5                 Region Latin America and Caribbean
  6 Environmental Category                           B

或者写一个函数来获取任意项目ID

 get_project <-function(id){
   res <- GET(
     url = "http://projects.worldbank.org",
    path = paste0("p2e/projectdetails?projId=", id, "&lang=en"),
    add_headers(
      Referer = paste0("http://projects.worldbank.org/", id, "/?lang=en&tab=details"), 
      `X-Requested-With` = "XMLHttpRequest")
  ) 
  content(res) %>% html_node("table") %>% html_table(header=TRUE)
}
get_project("P156880")

【讨论】:

  • 这就是我要找的。谢谢你的代码。右键单击projectdetails? 后,我尝试复制 cURL,但它给了我一个很长的 URL(只要它在 R 控制台中被压缩)。将有助于澄清如何获取 URL。谢谢!
  • 我在答案中添加了更多细节。只需将 cURL 复制到文本编辑器,然后将一些字段粘贴到 GET 选项中。我认为你不需要像 Cookie、User-Agent 或其他这样的标题。
  • 其实你可以用read_html( "http://projects.worldbank.org/p2e/projectdetails?projId=P156880&amp;lang=en") %&gt;% html_node("table") %&gt;% html_table( header=TRUE)读取页面加载的URL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 2023-03-16
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多