Как получить HTML-источник из URL с помощью Swift

Мне нужно посмотреть HTML-страницу, заданную определенным URL-адресом. Если у меня есть это, то какой самый эффективный и синхронный способ получить источник HTML для этого URL с помощью Swift? Я не смог найти краткую онлайн-версию, которая возвращает ее в переменную, а не печатать ее в файле completeHandler.

Мне нужно манипулировать источником вне любого вызова, использующего URL-адрес. Как это делается в Swift?

Ответы

Ответ 1

Отказ от ответственности. Поскольку это очень много просмотров, я просто хочу напомнить всем, что этот ответ здесь синхронный и заблокирует ваше приложение, если вы сделаете это в основном потоке. Вы всегда должны делать это асинхронно или в фоновом потоке, но вопрос задан для синхронного метода, поэтому было бы невозможно объяснить, как это сделать здесь.


Вероятно, вам стоит посмотреть на метод:

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

Возможно, вы захотите адаптировать кодировку (см. константы) в зависимости от того, какую кодировку использует ваша страница.


Старый ответ, 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")
}

Ответ 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")
}

Ответ 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, и это дает вам большую безопасность, гарантируя, что вы поймаете все ошибки.

Используйте только try!, если вы на 100% уверены, что вызов не сработает.

Дальнейшее чтение: https://www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch

Ответ 4

более компактный функциональный пример

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

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

Ответ 5

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