read_html()在R会话中引发致命错误

时间:2016-06-27 19:14:42

标签: r web-scraping rvest

我试图使用rvest和boilerpipeR废弃一组新闻文章。代码在大多数时间都可以正常工作,但是,它会因某些特定值而崩溃。我在线搜索高低,找不到任何类似的东西。

require(rvest)
require(stringr)
require(boilerpipeR)

# this is a problematic URL, its duplicates also generate fatal errors
url = "http://viagem.estadao.com.br/noticias/geral,museu-da-mafia-ganha-exposicao-permanente-da-serie-the-breaking-bad,10000018395"

content_html = getURLContent(url) # HTML source code in character type
article_text = ArticleExtractor(content_html) # returns 'NA' 

# next line induces fatal error 
encoded_exit = read_html(content_html ,encoding = "UTF-8")

paragraph = html_nodes(encoded_exit,"p")
article_text = html_text(paragraph)
article_text = iconv(article_text,from="UTF-8", to="latin1")

这不是ArticleExtractor()返回的唯一新闻片段' NA' to,并且构建代码以将其作为可行的结果来处理它。整个片段都在tryCatch()中,因此常规错误不应该停止执行。

主要问题是整个R会话崩溃并且必须重新加载,这阻止我抓取数据并对其进行调试。可能导致此问题的原因是什么?如何阻止它崩溃整个R会话?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。 无论是否使用32位或64位,RScript都会崩溃而没有任何错误消息(会话中止)。 我的解决方案是查看我正在抓取的URL。 如果URL在HTML-Code语法中有一些严重错误,则RScript将崩溃。它是可重复的。使用https://validator.w3.org检查页面。 在你的情况下:

  

" 错误:看到标签正文,但是相同类型的元素是   已经打开了。"

     

从第107行第1列;到第107行,第25栏

坠毁了。因此,您的文档有两个<body><body>个开头标记。对我来说,一个快速而肮脏的解决方案是首先检查,如果read_html获得有效的HTML内容:

url = "http://www.blah.de"
page = read_html(url, encoding = "UTF-8")

# check HTML-validity first to prevent fatal crash
if (!grepl("<html.*<body.*</body>.*</html>", toString(page), ignore.case=T)) {
   print("Skip this Site")
}

# proceed with html_nodes(..) etc