我正在尝试检索各种网站的大小,这些网站的网址会传递给我的脚本,但是当我传递无效的网址时,我没有收到异常,而只是获取一个非常小的网页。我正在使用Source.fromURL
,我得到以下结果:
thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway 1052
www.bbc.co.uk 113871
第一个,正如它所说,不应该有任何东西,但确实如此。我的脚本如下:
def main( args:Array[String] ){
val tasks = for(arg <- args) yield future {
try {
println(arg + " " + Source.fromURL( attachPrefix(arg) ).length)
} catch {
case e : java.net.UnknownHostException => println(arg + " *")
}
}
awaitAll(20000L, tasks: _*)
}
def attachPrefix( url:String ) = url.slice(0, 4) match {
case "http" => url
case "www." => "http://" + url
case _ => "http://www." + url
}
每个参数都被传递到函数attachPrefix
,以确保它在使用之前具有必要的前缀。这个问题只是因为我开始将url作为参数传递而不是将其映射到arg
,这就是我之前用
args map attachPrefix
两者之间有什么区别,为什么我现在的人会给出这样的行为?
答案 0 :(得分:1)
您可以使用Source.fromURL(URI)
签名。创建URI
将有效地验证URL
所记录的here。但是,在这种情况下,就URL
而言,http://www.thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway
URI
有效。另一方面,om-nom-nom建议的UrlValidator
认为它无效,因为顶级域名有超过4个字符已经过时。我不知道任何完全Scala验证库或为什么这是一个要求,但您可以尝试使用正则表达式进行验证。例如,这将抓住您的示例,因为顶级域超过6个字母:
val re = """^(https?://)?(([\w!~*'().&=+$%-]+: )?[\w!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([\w!~*'()-]+\.)*([\w^-][\w-]{0,61})?[\w]\.[a-z]{2,6})(:[0-9]{1,4})?((/*)|(/+[\w!~*'().;?:@&=+$,%#-]+)+/*)$""".r
re.pattern.matcher("http://google.com").matches // true
re.pattern.matcher("http://www.thisIsClearlyABoggusURLThatCantPossiblyLeadAnyway").matches // false