2014-10-01 111 views
15

我需要查看某個URL給出的頁面的HTML。如果我有,使用Swift獲取該URL的HTML源代碼的最有效和同步的方式是什麼?我一直無法找到一個簡明的聯機方式,將它返回到一個變量中,而不是將它打印在completionHandler中。如何從Swift獲取HTML源代碼

我需要操縱使用URL的任何調用之外的源。這是如何在Swift中完成的?

回答

33

免責聲明:由於這個觀點相當多,我只想提醒大家,這裏的答案是同步的,如果你在主線程中這樣做會阻止你的應用程序。您應該始終以異步方式或在後臺線程中執行此操作,但要求提供同步方法的問題,因此解釋如何在此處執行操作將超出範圍。


你或許應該看看方法:

+ stringWithContentsOfURL:encoding:errordocs

你會這樣稱呼它的目的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); 
} 

所以在斯威夫特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)") 
} 

您可能需要根據頁面使用的編碼來調整編碼(請參閱constants)。


老答案,雨燕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)") 
} 

老答案,雨燕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") 
} 
+0

'contentsOfURL:myURL'引發問題「可選類型的值' NSURL?因爲只有一個符號,所以無法對其進行編輯 – Jurik 2015-02-10 14:04:58

5

的更新@DCMaxx回答雨燕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") 
} 
+4

您已經在您的代碼中聲明瞭一個變量'error',它從來沒有被使用過,另一個非常重要的是您正在使用'嘗試!',但不推薦,因爲你告訴編譯器你永遠不會收到錯誤,但是如果你收到它,你將會有一個運行時錯誤,用地址'「http://www.asdsadsadas測試它, com「',你將有一個運行時錯誤。 – 2016-03-11 20:15:18

3

這是斯威夫特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") 
} 

同樣作爲額外涉及到以前的答案:
注意,斯威夫特2引入了一個新的錯誤處理方法,對於程序員產生更清晰的代碼閱讀,它消除了&等複雜性,通過NSErrors,並通過確保您捕獲所有錯誤,爲您提供更高的安全性。

如果您100%確定通話不會失敗,請僅使用try!

進一步閱讀:https://www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch

2

夫特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! 
    } 
3

更緊湊的功能實例

let myURLString = "https://google.com" 

let myHTMLString = NSURL(string: myURLString) 
    .flatMap { NSData(contentsOfURL: $0) } 
    .flatMap { NSString(data: $0, encoding: NSASCIIStringEncoding) }