Использование readHTMLtable из пакета XML для очистки сайта, неопределенное сообщение об ошибке - PullRequest
1 голос
/ 23 февраля 2012

Я использую пакет XML для очистки списка сайтов. В частности, я беру рейтинги из списка кандидатов на следующем сайте: voicemart .

Страницы кандидатов располагаются в порядке номеров от 1 и выше. Моя первая попытка отобрать первые 50 кандидатов выглядит следующим образом

library(xml)
library(plyr)

url <- paste("http://www.votesmart.org/candidate/evaluations/", 1:50 , sep = "")
res <- llply(url, function(i) readHTMLtable(i))

Но есть пара проблем - например, 25-я страница в этой последовательности генерирует ошибку 404 "url not found". Я решил эту проблему, сначала получив фрейм данных о количестве XML ошибок для каждой страницы в последовательности, а затем исключив страницы с единственной ошибкой. В частности

errors <- ldply(url, function(i) length(getXMLErrors(i)))
url2 <- url[which(errors$V1 > 1)]
res2 <- llply(url2, function(i) readHTMLTable(i))

Таким образом, я исключил 404 генерирующих URL из этого списка.

Однако все еще существует проблема, вызванная многочисленными страницами в списке, которые приводят к сбою этих команд llply. Ниже приведен пример

readHTMLTable("http://www.votesmart.org/candidate/evaluations/6")

, что приводит к ошибке

Error in seq.default(length = max(numEls)) : 
  length must be non-negative number
In addition: Warning message:
In max(numEls) : no non-missing arguments to max; returning -Inf

Однако эти страницы генерируют то же количество ошибок из команды getXMLErrors, что и рабочие страницы, поэтому я не могу различить их на этом фронте.

Мой вопрос - что означает эта ошибка, и есть ли способ получить readHTMLTable, чтобы вернуть пустой список для этих страниц, а не ошибку? В противном случае, могу ли я в своем заявлении llply проверить эти страницы и пропустить те, которые приводят к ошибке?

1 Ответ

3 голосов
/ 23 февраля 2012

Почему бы не просто обработать ошибку?

res <- llply(url, function(i) try(readHTMLTable(i)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...