我需要查看某个URL给出的页面的HTML。如果我有这个,使用Swift获取该URL的HTML源代码的最有效和同步方法是什么?我无法在线找到一种简洁的方法,将其返回到变量中,而不是在completionHandler中打印它。
我需要在任何使用URL的调用之外操纵源。这是如何在Swift中完成的?
答案 0 :(得分:45)
免责声明:由于这获得了很多观点,我只想提醒大家,这里的答案是同步的,如果你在主线程上这样做,会阻止你的应用。您应该始终异步执行此操作(在后台线程中),但问题是同步方法,因此解释如何在此处执行此操作将超出范围。
您应该查看方法:
+ 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)")
}
您可能希望根据网页使用的编码调整编码(请参阅constants)。
旧答案,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")
}
答案 1 :(得分:6)
斯威夫特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!
}
答案 2 :(得分:5)
更新的@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")
}
答案 3 :(得分:3)
这是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引入了一种新的错误处理方法,可以为程序员提供更清晰的代码读取,它消除了传递&
等NSErrors
的复杂性,并通过确保捕获它来提高安全性所有的错误。
如果您100%确定通话不会失败,则只能使用try!
。
进一步阅读: https://www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch
答案 4 :(得分:3)
更紧凑的功能实例
let myURLString = "https://google.com"
let myHTMLString = try URL(string: myURLString)
.flatMap { try Data(contentsOf: $0) }
.flatMap { String(data: $0, encoding: .ascii) }