我需要查看某個URL給出的頁面的HTML。如果我有,使用Swift獲取該URL的HTML源代碼的最有效和同步的方式是什麼?我一直無法找到一個簡明的聯機方式,將它返回到一個變量中,而不是將它打印在completionHandler中。如何從Swift獲取HTML源代碼
我需要操縱使用URL的任何調用之外的源。這是如何在Swift中完成的?
我需要查看某個URL給出的頁面的HTML。如果我有,使用Swift獲取該URL的HTML源代碼的最有效和同步的方式是什麼?我一直無法找到一個簡明的聯機方式,將它返回到一個變量中,而不是將它打印在completionHandler中。如何從Swift獲取HTML源代碼
我需要操縱使用URL的任何調用之外的源。這是如何在Swift中完成的?
免責聲明:由於這個觀點相當多,我只想提醒大家,這裏的答案是同步的,如果你在主線程中這樣做會阻止你的應用程序。您應該始終以異步方式或在後臺線程中執行此操作,但要求提供同步方法的問題,因此解釋如何在此處執行操作將超出範圍。
你或許應該看看方法:
+ stringWithContentsOfURL:encoding:error
(docs)
你會這樣稱呼它的目的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")
}
的更新@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")
}
您已經在您的代碼中聲明瞭一個變量'error',它從來沒有被使用過,另一個非常重要的是您正在使用'嘗試!',但不推薦,因爲你告訴編譯器你永遠不會收到錯誤,但是如果你收到它,你將會有一個運行時錯誤,用地址'「http://www.asdsadsadas測試它, com「',你將有一個運行時錯誤。 – 2016-03-11 20:15:18
這是斯威夫特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
夫特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!
}
更緊湊的功能實例
let myURLString = "https://google.com"
let myHTMLString = NSURL(string: myURLString)
.flatMap { NSData(contentsOfURL: $0) }
.flatMap { NSString(data: $0, encoding: NSASCIIStringEncoding) }
'contentsOfURL:myURL'引發問題「可選類型的值' NSURL?因爲只有一個符號,所以無法對其進行編輯 – Jurik 2015-02-10 14:04:58