2016-06-27 4 views
1

Я пытаюсь отказаться от набора новостей, используя rvest и boilerpipeR. Код работает отлично в течение большей части времени, однако он сбой для некоторых конкретных значений. Я искал онлайн высоко и низко и не мог найти никого подобного.read_html() вызывает фатальную ошибку в сеансе R

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», чтобы и код был построен, чтобы справиться с этим в качестве жизнеспособного результата. Весь этот фрагмент находится внутри tryCatch(), поэтому регулярные ошибки не могут остановить выполнение.

Основная проблема заключается в том, что весь сеанс R просто сбой и должен быть перезагружен, что мешает мне захватывать данные и отлаживать их. Что может быть причиной этой проблемы? И как я могу остановить его от сбоя всей сессии R?

ответ

1

У меня была та же проблема. Сбой RScript без какого-либо сообщения об ошибке (сеанс отменен), независимо от того, использую ли я 32 бит или 64 бит. Решение для меня состояло в том, чтобы посмотреть на URL, который я соскабливал. Если URL-адрес имеет некоторые серьезные ошибки в синтаксисе HTML-кода, 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 

+0

Спасибо за ответ. Я опаздываю на год и даже не работаю с R, но мне удалось перестроить среду, воспроизвести ошибку и проверить, что ваш обходной способ действительно работает. Престижность к вам. –

Смежные вопросы