我需要查看由某个URL给出的页面的HTML。如果我有这个,使用Swift获取该URL的HTML源的最有效和同步的方法是什么?我还没有找到一种简单的在线方式来将其返回到变量中,而不是在completionHandler中将其打印出来。
无论使用URL的任何调用,我都需要操纵源。如何在Swift中完成?
免责声明:由于这已经获得了很多意见,我只想提醒大家,这里的答案是同步的,如果您在主线程上执行此操作,则会阻止您的应用程序。 您应该始终以异步方式(在后台线程中)执行此操作,但是该问题要求使用同步方法,因此在此处解释如何执行此操作将超出范围。
您可能应该看一下该方法:
+ stringWithContentsOfURL:encoding:error(docs)
+ stringWithContentsOfURL:encoding:error
您将在Objective C中这样称呼它:
NSString *myURLString = @"http://google.com"; NSURL *myURL = [NSURL URLWithString:myURLString]; NSError *error = nil; NSString *myHTMLString = [NSString stringWithContentsOfURL:myURL encoding: NSUTF8StringEncoding error:&error]; if (error != nil) { NSLog(@"Error : %@", error); } else { NSLog(@"HTML : %@", myHTMLString); }
因此在Swift 3和Swift 4中,等效项为:
let myURLString = "https://google.com" guard let myURL = URL(string: myURLString) else { print("Error: \(myURLString) doesn't seem to be a valid URL") return } do { let myHTMLString = try String(contentsOf: myURL, encoding: .ascii) print("HTML : \(myHTMLString)") } catch let error { print("Error: \(error)") }
您可能要根据页面使用的编码来调整编码(请参见常量)。
旧答案,Swift 2.2:
let myURLString = "http://google.com" guard let myURL = NSURL(string: myURLString) else { print("Error: \(myURLString) doesn't seem to be a valid URL") return } do { let myHTMLString = try String(contentsOfURL: myURL) print("HTML : \(myHTMLString)") } catch let error as NSError { print("Error: \(error)") }
旧答案,Swift 1.2:
let myURLString = "http://google.com" if let myURL = NSURL(string: myURLString) { var error: NSError? let myHTMLString = NSString(contentsOfURL: myURL, encoding: NSUTF8StringEncoding, error: &error) if let error = error { println("Error : \(error)") } else { println("HTML : \(myHTMLString)") } } else { println("Error: \(myURLString) doesn't seem to be a valid URL") }