我在抓取网页时遇到了一些困难。具体来说,我正在抓取通常嵌入了表格的网页。但是,对于没有嵌入式表的实例,我似乎无法以不会破坏循环的方式来处理错误。
下面的示例代码:
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从第二个链接移到第三个链接。
有帮助吗?非常感谢!
答案 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