2013-08-20 3 views
1

У меня есть список URL (достаточно большой), и я хочу проверить, действительно ли их код HTML. Если это не так, я хочу знать количество ошибок и предупреждений, таких как результаты этой страницы: http://validator.w3.org/Как проверить HTML-страницы с помощью R?

Таким образом, через RI необходимо отправить мои URL-адреса на эту веб-страницу, а затем проанализировать результаты, чтобы получить необходимую мне информацию. , Есть ли другой способ сделать это?

Я нашел пакет RCurl, но я не уверен, как это сделать. Буду признателен за любую помощь.

Заранее спасибо.

Edit:

Я попытался следующий код, который, кажется, своего рода сделать работу, хотя я до сих пор не может обрабатывать несколько URL-адресов для какой-то неизвестной причине, по которой я получаю сообщение об ошибке и код останавливается (поэтому я теряю все).

HTMLValid=foreach(i=1:nrow(allData), .combine='rbind') %dopar% { 
    library(RCurl) 
    library(XML) 
    url=paste("http://validator.w3.org/check?uri=", 
      as.character(allData$url[i]), 
      "&charset=%28detect+automatically%29&doctype=Inline&group=0#preparse_warnings", 
      sep="") 
    w = getURL(url,httpheader = c('User-Agent' = "Mozilla/5.0 (Windows NT 6.1; rv:23.0) Gecko/20100101 Firefox/23.0")) 


    doc <- htmlTreeParse(w, getDTD = F) 
    r=xmlRoot(doc) 
    text=r[["body"]][[2]][[4]][[1]][[1]][[2]][[1]] 
    errors=strsplit(toString.XMLNode(text),' ')[[1]][1] 
    warnings=strsplit(toString.XMLNode(text),' ')[[1]][3] 

    c(as.numeric(errors),as.numeric(warnings)) 
} 

Возможно, я получаю ошибки, когда страница не отвечает в течение определенного периода времени. Как я могу это преодолеть? Есть ли способ сделать процедуру быстрее?

+0

Вы можете попробовать 'xmlSchemaValidate' из' library (XML) '. – Thomas

+0

Вы можете указать опцию foreach '.errorhandling = 'remove'', чтобы отфильтровать ошибки и только вернуть результаты задачи, которые преуспели. Таким образом, вы избегаете потери всего, когда несколько задач терпят неудачу. –

+0

@SteveWeston Таким образом, я не смогу идентифицировать случаи, для которых я не получил результаты. Или, может быть, я мог бы добавить итератор в результаты! Томас, я попробую! Благодаря!! – Stergios

ответ

0

Некоторые комментарии к вашему коду.

Возможно, вы не должны загружать свои библиотеки внутри цикла for. Я не уверен, что это приведет к сбоям, но вы должны загружать только ваши библиотеки.

Что еще более важно, не распараллеливайте свои веб-соскабливания. Для этого есть три причины: 1) Я не вижу, чтобы вы вычислили мощность, которая будет узким местом здесь, поэтому вы, вероятно, не будете получать какую-либо производительность путем параллелизации. 2) Ошибки могут возникать из-за того, что вы делаете слишком частые запросы на веб-сайт, и это «выкидывает вас». 3) Вы не собираете результаты по мере их поступления, чтобы потерять все ранее полученные результаты.

Простое исправление: используйте обычный цикл, предпочтительно с некоторым таймером внутри, чтобы гарантировать, что вы не делаете слишком много запросов в секунду. Сохраните результаты в списке на каждом шаге цикла (увеличивая размер вашего списка).

Если сообщение по-прежнему вызывает ошибку, по крайней мере, вы сохраните предыдущие результаты, и вы узнаете, в какой момент он разбился (чтобы вы могли переработать этот единственный пример вручную и посмотреть, что пошло не так).

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

Вот ваш переработанный код. Я его не запускал.

library(RCurl) 
library(XML) 
results <- list() 
for (i=1:nrow(allData)) { 

    Sys.sleep(1) 

    try({ 
    url=paste("http://validator.w3.org/check?uri=", 
      as.character(allData$url[i]), 
      "&charset=%28detect+automatically%29&doctype=Inline&group=0#preparse_warnings", 
      sep="") 
    w = getURL(url,httpheader = c('User-Agent' = "Mozilla/5.0 (Windows NT 6.1; rv:23.0) Gecko/20100101 Firefox/23.0")) 

    doc <- htmlTreeParse(w, getDTD = F) 
    r=xmlRoot(doc) 
    text=r[["body"]][[2]][[4]][[1]][[1]][[2]][[1]] 
    errors=strsplit(toString.XMLNode(text),' ')[[1]][1] 
    warnings=strsplit(toString.XMLNode(text),' ')[[1]][3] 
    results[[i]] <- c(as.numeric(errors),as.numeric(warnings)) 
    }) 
} 

Results <- do.call("rbind", results) 

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

  • Нет связанных вопросов^_^