Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用R验证HTML页面?_Html_R_Validation_Rcurl - Fatal编程技术网

如何使用R验证HTML页面?

如何使用R验证HTML页面?,html,r,validation,rcurl,Html,R,Validation,Rcurl,我有一个URL列表(足够大),我想检查它们的HTML代码是否有效。如果不是,我想知道错误和警告的数量,如本页的结果: 因此,我希望通过R将我的URL提交到该网页,然后解析结果以获得我需要的信息。还有别的方法吗 我已经找到了RCurl软件包,但我真的不知道该怎么做。我将感谢任何帮助 提前谢谢 编辑: 我尝试了下面的代码,虽然由于一些未知的原因我仍然无法处理一些URL,但是代码停止了(因此我失去了一切) HTMLValid=foreach(i=1:nrow(allData),.combine='rb

我有一个URL列表(足够大),我想检查它们的HTML代码是否有效。如果不是,我想知道错误和警告的数量,如本页的结果:

因此,我希望通过R将我的URL提交到该网页,然后解析结果以获得我需要的信息。还有别的方法吗

我已经找到了RCurl软件包,但我真的不知道该怎么做。我将感谢任何帮助

提前谢谢

编辑:

我尝试了下面的代码,虽然由于一些未知的原因我仍然无法处理一些URL,但是代码停止了(因此我失去了一切)

HTMLValid=foreach(i=1:nrow(allData),.combine='rbind')%dopar%{
图书馆(RCurl)
库(XML)
url=粘贴(“http://validator.w3.org/check?uri=",
as.character(allData$url[i]),
“&charset=%28detect+自动%29&doctype=Inline&group=0#准备警告”,
sep=“”)
w=getURL(url,httpheader=c('User-Agent'=“Mozilla/5.0(Windows NT 6.1;rv:23.0)Gecko/20100101 Firefox/23.0”))

doc对代码的一些注释

您可能不应该在for循环中加载库。我不确定这是否会导致崩溃,但您应该只加载一次库

更重要的是,不要将网络抓取并行化。原因有三: 1) 我不认为您的处理能力将成为这里的瓶颈,因此您可能不会通过并行化获得任何性能。 2) 这些错误可能是因为你对网站的请求过于频繁,网站会“把你赶出去”。 3) 您没有在结果出现时收集结果,因此您将丢失以前获得的所有结果

一个简单的修复方法:使用一个普通的for循环,最好在循环中加入一些计时器,以确保每秒不会发出太多请求。在循环的每一步将结果保存到列表中(增加列表的大小)

如果它最终仍然出错,至少您已经存储了以前的结果,并且您知道它在哪一点崩溃了(这样您就可以手工重做单个示例,看看哪里出了问题)

另一种可能是将循环的内部包含在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)
库(RCurl)
库(XML)

结果您可以从
库(XML)中尝试
xmlSchemaValidate
。您可以指定foreach
.errorhandling='remove'
选项,以便筛选出错误并仅返回成功的任务结果。这样,当一些任务失败时,您可以避免丢失所有内容。@Stevewest这样,我将无法识别未获得结果的情况。或者,我可以附加该结果结果中的erator!!Thomas我将尝试一下!谢谢!!@Thomas我无法使它适用于已保存在我电脑上的HTML文件。你有任何可用代码吗?我从未尝试过HTML(相对于其他XML),因此我没有具体的建议。
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)