首页 > 解决方案 > 需要帮助将带有 rvest 的表解析为数据框

问题描述

https://safer.fmcsa.dot.gov/query.asp?searchtype=ANY&query_type=queryCarrierSnapshot&query_param=USDOT&original_query_param=NAME&query_string=2249709&original_query_string=ARKANSAS%20BEST%20LOGISTICS%20INC

我需要将上面网页中的美国检查/崩溃表解析为 R 数据框。适用于网站上某些表格的解析技术不适用于其他表格。

我能够使用以下代码解析检查表:

    inspections <- carrier %>%
      html_node('.querylabel+ center table') %>%
      html_table(fill = TRUE)

但是当我尝试解析检查表正下方的崩溃表时,我得到了错误:

    Error in UseMethod("html_table") : 
      no applicable method for 'html_table' applied to an object of class 
    "xml_missing"

我使用了以下代码:

    crashes <- carrier %>%
      html_node('center:nth-child(19) table') %>%
      html_table(fill = TRUE)

我使用选择器小工具来选择该表的 css 是“center:nth-child(19) table”。我还尝试将 html_node() 与 x 路径一起使用:

    crashes <- carrier %>%
      html_node(xpath = '//center[(((count(preceding-sibling::*) + 1) = 
     19) and parent::*)]//table') %>%
      html_table(fill = TRUE)

那也没有用。我对网络抓取非常陌生,所以如果这是一个简单的解决方案,我深表歉意。

运营商是网址:

    carrier <- read_html(https://safer.fmcsa.dot.gov/query.asp?searchtype=ANY&query_type=queryCarrierSnapshot&query_param=USDOT&original_query_param=NAME&query_string=2249709&original_query_string=ARKANSAS%20BEST%20LOGISTICS%20INC)

标签: rweb-scrapingrvest

解决方案


有两个“Inspections”表和两个“Crashes”表,美国和加拿大各一个。这里有两种接近它的方法:

  1. 使用前面的链接(“Inspections:”、“Crashes:”)来识别center链接后面的元素。然后寻找table节点,并解析它。

library(rvest)
dot_url <- 
  "https://safer.fmcsa.dot.gov/query.asp?searchtype=ANY&query_type=queryCarrierSnapshot&query_param=USDOT&original_query_param=NAME&query_string=2249709&original_query_string=ARKANSAS%20BEST%20LOGISTICS%20INC" %>% 
  read_html()

dot_url %>% 
  html_node("a[href$='#Inspections'] + center") %>% 
  html_node("table") %>% 
  html_table()
              Inspection Type Vehicle Driver Hazmat IEP
1                 Inspections       0      0      0   0
2              Out of Service       0      0      0   0
3            Out of Service %      0%     0%     0%  0%
4 Nat'l Average %(2009- 2010)  20.72%  5.51%  4.50% N/A
dot_url %>% 
  html_node("a[href$='#Accidents'] + center") %>% 
  html_node("table") %>% 
  html_table()
     Type Fatal Injury Tow Total
1 Crashes     0      0   0     0

您也可以为加拿大执行此操作,a[href$='#InspectionsCA'] ...但格式不理想(“崩溃:”表具有相同的href值)。(请注意,这href$=意味着链接以该文本结尾:https ://www.w3.org/TR/2011/REC-css3-selectors-20110929/#selectors 。)


  1. 获取两组“Inspections”和“Crashes”表,使用表的summary字段并命名它们(使用例如purrr::set_namesc("US", "Canada")),或丢弃你不想要的(使用[[):

dot_url %>% 
  html_nodes("table[summary='Inspections']") %>% 
  html_table()
[[1]]
              Inspection Type Vehicle Driver Hazmat IEP
1                 Inspections       0      0      0   0
2              Out of Service       0      0      0   0
3            Out of Service %      0%     0%     0%  0%
4 Nat'l Average %(2009- 2010)  20.72%  5.51%  4.50% N/A

[[2]]
   Inspection Type Vehicle Driver
1      Inspections       0      0
2   Out of Service       0      0
3 Out of Service %      0%     0%
dot_url %>% 
  html_nodes("table[summary='Crashes']") %>% 
  html_table()
[[1]]
     Type Fatal Injury Tow Total
1 Crashes     0      0   0     0

[[2]]
     Type Fatal Injury Tow Total
1 Crashes     0      0   0     0

推荐阅读