亲爱的斯塔克溢出用户:
我正在使用R从心理学今天的一些心理治疗师的档案;这是为了锻炼和学习更多关于网络抓取。
我是新来的R,我必须经历这种紧张的训练,这将帮助我在未来的项目。这意味着我可能不知道目前我在做什么(例如,我可能无法很好地解释来自R的脚本或错误消息),但我必须完成它。因此,请原谅可能的误解或不准确之处。
简言之,情况如下。我创建了一个函数,通过该函数从心理治疗师配置文件的两个节点中获取信息;该函数显示在此stackoverflow post上。
然后,我创建一个循环,在一些心理治疗师的配置文件上使用该函数;循环也在上面的文章中,但是我在下面报告它,因为这是脚本中产生一些问题的部分(除了我在上面提到的文章中解决的问题之外)。
j <- 1
MHP_codes <- c(150140:150180) #therapist identifier
df_list <- vector(mode = "list", length(MHP_codes))
for(code1 in MHP_codes) {
URL <- paste0('https://www.psychologytoday.com/us/therapists/illinois/', code1)
#Reading the HTML code from the website
URL <- read_html(URL)
df_list[[j]] <- tryCatch(getProfile(URL),
error = function(e) NA)
j <- j + 1
}当循环完成后,我将来自不同配置文件的信息绑定到一个数据帧中并保存它。
final_df <- rbind.fill(df_list)
save(final_df,file="final_df.Rda")该函数(getProfile)在单个配置文件上运行良好。它也适用于小范围的配置文件( c(150100:150150))。请注意,我不知道实际分配了什么精神药物id;因此,这个范围内的许多URL并不存在。
但是,一般来说,tryCatch应该解决这个问题。当URL不存在(因此ID不与任何精神病专家相关联)时,两个节点(因此,我的数据帧中的两个对应变量中的每一个)都是空的(即数据帧在相应的单元格中显示NAs )。
但是,在某些in范围内,可能会出现两个问题。
首先,我收到一条错误消息,例如下面的一条:
Open.connection中的错误(x,"rb"):HTTP错误404。
因此,尽管我是usign,而且它通常看起来正常工作(至少在出现错误消息之前),这种情况还是会发生的。
此外,在循环停止和R运行行之后:
final_df <- rbind.fill(df_list)
出现第二条错误消息:
警告消息:在df[var]中:关闭未使用的连接3 ()
这个空URL似乎有一个特定的问题。事实上,当我更改ID范围时,尽管不存在URL,循环仍然工作得很好:一方面,当URL存在时,信息被从网站中刮走;另一方面,当URL不存在时,与该URL相关的两个变量(以及心理治疗师ID)得到安娜。
如果URL是空的,可以告诉R跳过URL吗?什么都不录?这个解决方案会很好,因为它会将数据帧缩小到现有的URL,但我不知道如何做,我也不知道它是否解决了我的问题。
有谁能帮我解决这个问题吗?
发布于 2019-09-27 02:04:02
是的,您需要在tryCatch调用周围包装一个read_html。这是R试图连接到网站的地方,因此如果连接失败,它将抛出一个错误(而不是返回一个空对象)。您可以捕获该错误,然后使用next告诉R跳到循环的下一次迭代。
library(rvest)
##Valid URL, works fine
URL <- "https://news.bbc.co.uk"
read_html(URL)
##Invalid URL, error raised
URL <- "https://news.bbc.co.uk/not_exist"
read_html(URL)
##Leads to error
Error in open.connection(x, "rb") : HTTP error 404.
##Invalid URL, catch and skip to next iteration of the loop
URL <- "https://news.bbc.co.uk/not_exist"
tryCatch({
URL <- read_html(URL)},
error=function(e) {print("URL Not Found, skipping")
next})发布于 2019-09-27 16:14:58
我要感谢@Jul给出的答案。在这里,我发布了我更新的循环:
j <- 1
MHP_codes <- c(150000:150200) #therapist identifier
df_list <- vector(mode = "list", length(MHP_codes))
for(code1 in MHP_codes) {
delayedAssign("do.next", {next})
URL <- paste0('https://www.psychologytoday.com/us/therapists/illinois/', code1)
#Reading the HTML code from the website
URL <- tryCatch(read_html(URL),
error = function(e) force(do.next))
df_list[[j]] <- getProfile(URL)
j <- j + 1
}
final_df <- rbind.fill(df_list)正如您所看到的,有些东西必须改变:虽然@Jul的答案已经接近解决问题,但是循环仍然停止,因此我不得不稍微改变原来的建议。特别是,我在循环中引入了以下行,但在tryCatch函数之外:
delayedAssign("do.next", {next})在tryCatch函数中,有以下参数:
force(do.next)这是基于另一个stackoverlflow post的。
https://stackoverflow.com/questions/58126097
复制相似问题