试图抓取网页标题,但遇到一个名为" tweg.com"
的网站的问题Chrome => Ctrl+Shift+I
read_html因错误消息而停止:"错误:无法解析文本"。 查看page.get $ content,发现它是空的(raw(0))。
当然,可以编写一个简单的检查来考虑这一点并避免使用read_html进行解析。但是,感觉更优雅的解决方案是从read_html中获取一些内容,然后根据它返回一个空页面标题(即"")。尝试传球"选项" read_html,如RECOVER,NOERROR和NOBLANKS,但没有成功。任何想法如何回归"空页"来自read_html的回复?
答案 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
包还包含两个函数possibly
和safely
,它们执行相同的操作,但接受更灵活的函数定义。请注意,它们是副词,因此返回一个仍然必须被调用的函数,这就是调用后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