R语言网页抓取时出现‘无法解析主机: www.canada.cahttp’错误的技术求助
排查并解决网页抓取中的"Could not resolve host"错误
这个错误提示Could not resolve host: www.canada.cahttp一眼就能看出问题出在URL拼接的格式错误上——你生成的链接里域名和路径(或者其他URL部分)没有正确分隔,导致出现了www.canada.cahttp这种完全无效的主机名,R自然没法解析它。
先分析你的代码问题:
你用paste("https://www.canada.ca",x,sep="")来拼接域名和链接路径,但这个写法有两个致命问题:
- 如果
x是不带开头斜杠的相对路径(比如en/xxx.html),拼接后会变成https://www.canada.caen/xxx.html,域名和路径直接粘在一起,完全无法访问。 - 如果
x本身已经是完整URL(比如第8个链接),拼接后会变成https://www.canada.cahttps://xxx.com这种四不像的链接,直接导致www.canada.cahttp这种错误主机名。
你后来手动替换了第8个链接,但前面的lapply已经对其他链接做了错误拼接,而且没处理其他可能是完整URL的情况,所以还是会报错。
给出两种解决方案:
方案1:用专业工具处理URL拼接(推荐)
httr包的url_join函数专门用来处理URL拼接,它会自动识别相对路径、完整URL,帮你补全必要的斜杠,完全不用手动判断:
# 先安装并加载httr包(如果还没装的话) install.packages("httr") library(httr) # 替换你原来的拼接代码 treaties_links_full <- lapply(treaties_links, function(x) url_join("https://www.canada.ca", x))
这下不用再手动处理第8个链接了,url_join会自动识别已经是完整URL的链接,直接保留原内容。
方案2:手动修正拼接逻辑
如果不想额外装包,可以自己写判断逻辑,先检查链接是否是完整URL,再决定是否拼接:
treaties_links_full <- lapply(treaties_links, function(x) { # 先判断这个链接是不是已经带http/https的完整URL if (grepl("^http", x)) { x # 是的话直接返回原链接 } else { # 不是的话,先确保路径开头有斜杠,再拼接域名 if (!startsWith(x, "/")) x <- paste0("/", x) paste("https://www.canada.ca", x, sep="") } })
最后别忘了验证
在执行read_html之前,先打印一下treaties_links_full,确认所有链接都是格式正确的有效URL:
print(treaties_links_full)
这样再运行treaty_texts <- lapply(treaties_links_full, function(x) (read_html(x)))应该就不会报错了。
内容的提问来源于stack exchange,提问作者AngusGord
相关产品推荐
相关产品推荐

