简体   繁体   English

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

[英]How To Get HTML source from URL with Swift

I need to look at the HTML of a page given by a certain URL. 我需要查看某个URL给出的页面的HTML。 If I have this, what is the most efficient and synchronous way to get the HTML source for that URL using Swift? 如果我有这个,使用Swift获取该URL的HTML源代码的最有效和同步方法是什么? I haven't been able to find a concise way online that returns it into a variable as opposed to printing it in a completionHandler. 我无法在线找到一种简洁的方法,将其返回到变量中,而不是在completionHandler中打印它。

I need to manipulate the source outside of whatever call uses the URL. 我需要在任何使用URL的调用之外操纵源代码。 How is this done in Swift? 这是如何在Swift中完成的?

Disclaimer : Since this is getting quite a lot of views, I just want to remind everyone that this answer here is synchronous, and will block your app if you do it on the main thread. 免责声明:由于这获得了很多观点,我只想提醒大家,这里的答案是同步的,并且如果你在主线程上这样做会阻止你的应用。 You should always do this asynchronously (in a background thread), but the question asked for a synchronous method, so it would be out of scope to explain how to do it here. 您应该始终异步执行此操作(在后台线程中),但问题是同步方法,因此在此处解释如何执行此操作将超出范围。


You should probably look at the method : 你应该看一下这个方法:

+ stringWithContentsOfURL:encoding:error ( docs ) + stringWithContentsOfURL:encoding:errordocs

You would call it like this in Objective C : 你可以在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);
}

So in Swift 3 and 4, the equivalent would be : 所以在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)")
}

You might want to adapt the encoding (see the constants ) depending on which encoding your page's using. 您可能希望根据页面使用的编码调整编码(请参阅常量 )。


Old answer, Swift 2.2 : 老答案,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)")
}

Old answer, Swift 1.2 : 老答案,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")
}

Swift 3: 斯威夫特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!
    }

An updated @DCMaxx answer to Swift 2.2 : 更新的@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")
}

more compact functional example 更紧凑的功能实例

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

let myHTMLString = try URL(string: myURLString)
    .flatMap { try Data(contentsOf: $0) }
    .flatMap { String(data: $0, encoding: .ascii) }

This is the way to go in Swift 2: 这是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")
}

Also as an extra related to previous answers: 另外,作为与以前的答案额外的
Note that Swift 2 introduces a new error handling approach that produces much clearer code for programmers to read, it does away with complexities like & to pass in NSErrors , and it gives you greater safety by ensuring you catch all errors. 需要注意的是斯威夫特2引入了产生更清晰的代码,程序员阅读一个新的错误处理方法,它具有像复杂摒弃&在传递NSErrors ,并确保你抓住所有的错误提供了更大的安全性。

Only use try! 只用try! if you are 100% sure that the call won't fail. 如果您100%确定通话不会失败。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM