r - 需要帮助将带有 rvest 的表解析为数据框
问题描述
我需要将上面网页中的美国检查/崩溃表解析为 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)
解决方案
有两个“Inspections”表和两个“Crashes”表,美国和加拿大各一个。这里有两种接近它的方法:
- 使用前面的链接(“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 。)
- 获取两组“Inspections”和“Crashes”表,使用表的
summary
字段并命名它们(使用例如purrr::set_names
和c("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
推荐阅读
- pandas - 将命名实体提取到数据框中的列
- c++ - C++ - 使用库设置谷歌基准输出文件和路径
- flutter - ImagePicker 选择/Flutter 后未显示图像
- json - pyspark - 从分组数据生成 json
- c# - 如何将 ASCII 代码视为字符串而不是字符
- pine-script - 如何确定蜡烛的大小是否是看涨和看跌的两倍
- javascript - 点/括号符号 - 动态键
- ansible - 使用ansible,我如何遍历列表并将项目用作查找值的键
- r - groupby 然后在许多列中找到最大值
- javascript - 在 NodeJs 中使用 3rd 方 lib 文件并出现 LNK2001 错误