首页 > 解决方案 > readHTMLTable 丢失行

问题描述

我尝试使用 readHTMLTable 来阅读

https://ows.doleta.gov/unemploy/trigger/2002/trig_101302.html

(下载成 .html 文件后,这里不知道怎么上传。下载代码是 download.file(FullURL,filename1) )

结果表丢失了很多行,很多状态消失了。比如说,结果列表只有 40 行,而 html 文件中有 53 个状态和很多非状态行。我试过标题的东西,但它不起作用。

非常感谢任何有助于获得包含所有状态的完整表格的建议。

标签: rweb-scrapinghtml-parsingrvest

解决方案


该表的内部结构非常令人震惊,因此您需要做一些工作才能将其提取到适当的数据框中。使用rvest进行抓取,使用 base R 进行清理(如果您愿意,有很多有用的替代包),

library(rvest)

# scrape HTML
h <- read_html('https://ows.doleta.gov/unemploy/trigger/2002/trig_101302.html')

df <- h %>% 
  html_node('table') %>%    # select <table> HTML node
  html_table(fill = TRUE) %>%    # extract table from HTML to data frame
  head(57)    # omit end matter

# fix names to the point of R legality
names(df) <- make.names(gsub('\\s+', '.', 
                             sapply(head(df, 4), 
                                    paste, collapse = '.')), 
                        unique = TRUE)

df <- df[-1:-4, ]    # remove rows with names
df[] <- lapply(df, type.convert, as.is = TRUE)    # coerce to appropriate types

str(df)
#> 'data.frame':    53 obs. of  12 variables:
#>  $ ...                                     : chr  "" "" "" "" ...
#>  $ ....1                                   : chr  "" "" "" "" ...
#>  $ ....2                                   : chr  "&" "" "&" "&" ...
#>  $ ....3                                   : chr  "Alabama" "Alaska" "Arizona" "Arkansas" ...
#>  $ INDICATORS...                           : logi  NA NA NA NA NA NA ...
#>  $ INDICATORS.13WeekIUR..                  : num  2.17 3.63 1.97 2.87 3.38 1.69 3.08 2.02 1.62 1.88 ...
#>  $ INDICATORS.Pct.ofPrior2.Yrs..           : int  118 109 134 117 137 182 150 133 122 131 ...
#>  $ INDICATORS.3.moSATUR..                  : num  5.6 6.9 5.9 5.1 6.4 5.1 3.8 4 6 5.3 ...
#>  $ INDICATORS.Pct.of.prior.Year.           : int  105 109 128 98 120 141 111 121 89 112 ...
#>  $ INDICATORS.Pct.of.prior.2ndYear.        : int  121 106 151 115 128 182 180 97 107 147 ...
#>  $ INDICATORS.Pct.of.prior.Avail.WKS.      : int  NA NA NA NA NA NA NA NA NA NA ...
#>  $ STATUS.Periods.Begin.Date.B.End.Date.E..: chr  "E 06-04-1983" "E 06-01-2002" "E 10-23-1982" "E 03-26-1983" ...

它仍然不是很好,但是从这一点可以更容易地清理它。


推荐阅读