R网页搜罗:网页不包含表格时的错误处理

时间:2018-07-28 03:23:16

标签: r web-scraping try-catch rvest

我在抓取网页时遇到了一些困难。具体来说,我正在抓取通常嵌入了表格的网页。但是,对于没有嵌入式表的实例,我似乎无法以不会破坏循环的方式来处理错误。

下面的示例代码:

event = c("UFC 226: Miocic vs. Cormier", "ONE Championship 76: Battle for the Heavens", "Rizin FF 12")
eventLinks = c("https://www.bestfightodds.com/events/ufc-226-miocic-vs-cormier-1447", "https://www.bestfightodds.com/events/one-championship-76-battle-for-the-heavens-1532", "https://www.bestfightodds.com/events/rizin-ff-12-1538")
testLinks = data.frame(event, eventLinks)

for (i in 1:length(testLinks)) {
  print(testLinks$event[i])
  event = tryCatch(as.data.frame(read_html(testLinks$eventLink[i]) %>% html_table(fill=T)),
                   error = function(e) {NA})
}

第二个链接未嵌入表。我以为只是用tryCatch跳过了它,但是链接没有打破它,而是打破了循环。

我希望弄清楚的是一种跳过没有表的链接,但是继续抓取列表中的下一个链接的方法。要继续使用上面的示例,我希望tryCatch从第二个链接移到第三个链接。

有帮助吗?非常感谢!

1 个答案:

答案 0 :(得分:2)

这里有一些要解决的问题。首先,您的链接被认为是因素(您可以在testLinks %>% sapply(class)中看到它,因此您需要使用as.chracter()将它们转换为字符,我已经在下面的代码中完成了此操作。

第二,您需要将每个抓取片段分配给一个列表元素,因此我们使用events <- list()在循环中 创建一个列表,然后将每个抓取片段分配给列表的元素< em> inside 循环,即events[[i]] <- "something",如果没有列表,您将只用第二个覆盖第一个刮擦,然后用第三个覆盖第二个刮擦,依此类推。

现在,当url不包含表(不会有错误)时,tryCatch将起作用并分配NA

events <- list()
for (i in 1:nrow(testLinks)) {
  print(testLinks$event[i])
  events[[i]] = tryCatch(as.data.frame(read_html(testLinks$eventLink[i] %>% as.character(.)) %>% html_table(fill=T)),
                   error = function(e) {NA})
}

events