如何使用Swift从URL获取HTML源代码

我需要查看某个URL给出的页面的HTML。 如果我有这个,使用Swift获取该URL的HTML源代码的最有效和同步方法是什么? 我无法在网上找到一种简洁的方法,将其返回到变量中,而不是在completionHandler中打印它。

我需要在任何使用URL的调用之外操作源。 这是如何在Swift中完成的?

免责声明:由于这获得了很多观点,我只想提醒大家这里的答案是同步的,并且如果你在主线程上这样做会阻止你的应用。 您应该始终异步(在后台线程中)执行此操作,但问题是同步方法,因此在此处解释如何执行此操作将超出范围。


你应该看一下这个方法:

+ stringWithContentsOfURL:encoding:error ( docs )

你可以在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和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") } 

更新的@DCMaxx对Swift 2.2的回答:

 let myURLString = "http://www.yahoo.com" if let myURL = NSURL(string: myURLString) { var error: NSError? let myHTMLString = try! NSString(contentsOfURL: myURL, encoding: NSUTF8StringEncoding) if let error = error { print("Error : \(error)") } else { print("HTML : \(myHTMLString)") } } else { print("Error: \(myURLString) doesn't URL") } 

这是Swift 2的方法:

 let myURLString = "https://duckduckgo.com/" if let myURL = NSURL(string: myURLString) { do { let myHTMLString = try String(contentsOfURL: myURL, encoding: NSUTF8StringEncoding) print("HTML : \(myHTMLString)") } catch { print("Error : \(error)") } } else { print("Error: \(myURLString) doesn't URL") } 

另外与以前的答案有关:
请注意,Swift 2引入了一种新的error handling方法,可以为程序员提供更清晰的代码读取,它消除了复杂性,例如传递NSErrors ,并通过确保捕获所有错误来提高安全性。

只用try! 如果您100%确定通话不会失败。

进一步阅读: https //www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch

斯威夫特3:

  if let url = URL(string: "https://www.google.com/trends/hottrends/atom/hourly") { do { let contents = try String(contentsOf: url) print(contents) } catch { // contents could not be loaded } } else { // the URL was bad! } 

更紧凑的function实例

 let myURLString = "https://google.com" let myHTMLString = try URL(string: myURLString) .flatMap { try Data(contentsOf: $0) } .flatMap { String(data: $0, encoding: .ascii) } 
Interesting Posts