处理来自read_html的空网页的错误响应

时间:2016-12-12 04:19:34

标签: r rvest httr

试图抓取网页标题,但遇到一个名为" tweg.com"

的网站的问题
Chrome => Ctrl+Shift+I

read_html因错误消息而停止:"错误:无法解析文本"。 查看page.get $ content,发现它是空的(raw(0))。

当然,可以编写一个简单的检查来考虑这一点并避免使用read_html进行解析。但是,感觉更优雅的解决方案是从read_html中获取一些内容,然后根据它返回一个空页面标题(即"")。尝试传球"选项" read_html,如RECOVER,NOERROR和NOBLANKS,但没有成功。任何想法如何回归"空页"来自read_html的回复?

1 个答案:

答案 0 :(得分:3)

您可以使用tryCatch来捕获错误并特别返回一些内容(如果您只想返回错误并继续,则只需try(read_html('http://tweg.com'), silent = TRUE)即可)。你需要传递tryCatch一个函数来捕获错误时返回的内容,你可以随意构建它。

library(rvest)


tryCatch(read_html('http://tweg.com'), 
         error = function(e){'empty page'})    # just return "empty page"
#> [1] "empty page"

tryCatch(read_html('http://tweg.com'), 
         error = function(e){list(result = 'empty page', 
                                  error = e)})    # return error too
#> $result
#> [1] "empty page"
#> 
#> $error
#> <Rcpp::exception in eval(substitute(expr), envir, enclos): Failed to parse text>

purrr包还包含两个函数possiblysafely,它们执行相同的操作,但接受更灵活的函数定义。请注意,它们是副词,因此返回一个仍然必须被调用的函数,这就是调用后URL在括号中的原因。

library(purrr)

possibly(read_html, 'empty page')('http://tweg.com')
#> [1] "empty page"

safely(read_html, 'empty page')('http://tweg.com')
#> $result
#> [1] "empty page"
#> 
#> $error
#> <Rcpp::exception in eval(substitute(expr), envir, enclos): Failed to parse text>

一个典型的用法是将结果函数映射到一个URL向量:

c('http://tweg.com', 'http://wikipedia.org') %>% 
    map(safely(read_html, 'empty page'))
#> [[1]]
#> [[1]]$result
#> [1] "empty page"
#> 
#> [[1]]$error
#> <Rcpp::exception in eval(substitute(expr), envir, enclos): Failed to parse text>
#> 
#> 
#> [[2]]
#> [[2]]$result
#> {xml_document}
#> <html lang="mul" dir="ltr" class="no-js">
#> [1] <head>\n  <meta charset="utf-8"/>\n  <title>Wikipedia</title>\n  <me ...
#> [2] <body id="www-wikipedia-org">\n<h1 class="central-textlogo" style="f ...
#> 
#> [[2]]$error
#> NULL