【问题标题】:How to validate HTML pages with R?如何使用 R 验证 HTML 页面?
【发布时间】:2013-08-20 12:16:55
【问题描述】:

我有一个 URL 列表(足够大),我想检查它们的 HTML 代码是否有效。如果不是,我想知道像这个页面的结果一样的错误和警告的数量:http://validator.w3.org/

因此,我想通过 R 将我的 URL 提交到该网页,然后解析结果以获取我需要的信息。还有其他方法吗?

我找到了 RCurl 包,但我不确定如何去做。如有任何帮助,我将不胜感激。

提前致谢。

编辑:

我尝试了以下代码,这似乎可以完成这项工作,尽管由于某些未知原因我仍然无法处理一些 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))
}

当页面在特定时间范围内没有响应时,我可能会收到错误消息。我该如何克服呢?有没有办法更快地完成这个过程?

【问题讨论】:

  • 你可以试试 xmlSchemaValidate from library(XML)
  • 您可以指定foreach .errorhandling='remove' 选项以过滤掉错误并仅返回成功的任务结果。这样,您就可以避免在一些任务失败时丢失所有内容。
  • @SteveWeston 这样我将无法识别我没有得到结果的案例。或者也许我可以在结果中附加迭代器!!托马斯 我试试看!谢谢!!
  • @Thomas 我无法让它适用于已经保存在我电脑上的 HTML 文件。你有任何工作代码吗?
  • 我从未真正尝试过用于 HTML(相对于其他 XML),所以我没有具体的建议。

标签: html r validation rcurl


【解决方案1】:

您的代码中有一些 cmets。

您可能不应该在 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多