web-dev-qa-db-fra.com

Comment obtenir une source HTML à partir d'une URL avec Swift

J'ai besoin de regarder le HTML d'une page donnée par une certaine URL. Si je l'ai, quelle est la façon la plus efficace et la plus synchrone d'obtenir la source HTML pour cette URL à l'aide de Swift? Je n'ai pas été en mesure de trouver un moyen concis en ligne qui le renvoie dans une variable au lieu de l'imprimer dans un CompleterHandler.

J'ai besoin de manipuler la source en dehors de tout appel utilisant l'URL. Comment cela se fait-il dans Swift?

24
Alex Beals

Clause de non-responsabilité: Étant donné que cela obtient beaucoup de vues, je tiens à rappeler à tout le monde que cette réponse est synchrone et bloquera votre application si vous le faites sur le thread principal. Vous devriez toujours le faire de manière asynchrone (dans un fil d'arrière-plan), mais la question demandait une méthode synchrone, il serait donc hors de portée d'expliquer comment le faire ici.


Vous devriez probablement regarder la méthode:

+ stringWithContentsOfURL:encoding:error ( documents )

Vous l'appeleriez ainsi dans l'objectif 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);
}

Donc, dans Swift 3 et 4, l'équivalent serait:

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)")
}

Vous voudrez peut-être adapter l'encodage (voir les constantes ) selon l'encodage utilisé par votre page.


Ancienne réponse, 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)")
}

Ancienne réponse, 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")
}
46
DCMaxxx

Swift 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!
    }
7
Crashalot

Une réponse @DCMaxx mise à jour à 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")
}
5
Meseery

exemple fonctionnel plus compact

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

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

C'est la voie à suivre dans 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")
}

Aussi comme extra lié aux réponses précédentes:
Notez que Swift 2 introduit une nouvelle approche de gestion des erreurs qui produit un code beaucoup plus clair pour les programmeurs à lire, il supprime des complexités comme & pour passer NSErrors, et cela vous donne une plus grande sécurité en vous assurant de détecter toutes les erreurs.

Seule utilisation try! si vous êtes sûr à 100% que l'appel n'échouera pas.

Pour en savoir plus: https://www.hackingwithswift.com/new-syntax-Swift-2-error-handling-try-catch

3
Javier Cadiz