首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tryCatch函数可以在大多数不存在的URL上工作,但它不工作(至少在一种情况下)。

tryCatch函数可以在大多数不存在的URL上工作,但它不工作(至少在一种情况下)。
EN

Stack Overflow用户
提问于 2019-09-26 23:56:50
回答 2查看 489关注 0票数 0

亲爱的斯塔克溢出用户:

我正在使用R从心理学今天的一些心理治疗师的档案;这是为了锻炼和学习更多关于网络抓取。

我是新来的R,我必须经历这种紧张的训练,这将帮助我在未来的项目。这意味着我可能不知道目前我在做什么(例如,我可能无法很好地解释来自R的脚本或错误消息),但我必须完成它。因此,请原谅可能的误解或不准确之处。

简言之,情况如下。我创建了一个函数,通过该函数从心理治疗师配置文件的两个节点中获取信息;该函数显示在此stackoverflow post上。

然后,我创建一个循环,在一些心理治疗师的配置文件上使用该函数;循环也在上面的文章中,但是我在下面报告它,因为这是脚本中产生一些问题的部分(除了我在上面提到的文章中解决的问题之外)。

代码语言:javascript
复制
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
  }

当循环完成后,我将来自不同配置文件的信息绑定到一个数据帧中并保存它。

代码语言:javascript
复制
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,但我不知道如何做,我也不知道它是否解决了我的问题。

有谁能帮我解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-27 02:04:02

是的,您需要在tryCatch调用周围包装一个read_html。这是R试图连接到网站的地方,因此如果连接失败,它将抛出一个错误(而不是返回一个空对象)。您可以捕获该错误,然后使用next告诉R跳到循环的下一次迭代。

代码语言:javascript
复制
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})
票数 1
EN

Stack Overflow用户

发布于 2019-09-27 16:14:58

我要感谢@Jul给出的答案。在这里,我发布了我更新的循环:

代码语言:javascript
复制
  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函数之外:

代码语言:javascript
复制
delayedAssign("do.next", {next})

在tryCatch函数中,有以下参数:

代码语言:javascript
复制
force(do.next)

这是基于另一个stackoverlflow post的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58126097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档