【问题标题】:Need help parsing a table with rvest into dataframe需要帮助将带有 rvest 的表解析为数据框
【发布时间】:2019-07-12 01:33:16
【问题描述】:

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'。我还尝试使用带有 x 路径的 html_node():

    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)

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    有两个“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
    

    【讨论】:

    • 非常好的答案 +
    • @gizaom 如果答案完美,那么您应该通过单击 ✓ 来接受它。这样其他人也会知道什么对你有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多