web-dev-qa-db-ja.com

Swiftを使用してURLからHTMLソースを取得する方法

特定のURLで指定されたページのHTMLを見る必要があります。これがある場合、Swiftを使用してそのURLのHTMLソースを取得する最も効率的で同期的な方法は何ですか? completionHandlerで出力するのではなく、変数に返す簡潔な方法をオンラインで見つけることができませんでした。

URLを使用する呼び出しの外部でソースを操作する必要があります。これはSwiftでどのように行われますか?

24
Alex Beals

免責事項:これは非常に多くのビューを取得しているため、ここでの答えは同期的であり、メインスレッドでそれを行うとアプリをブロックすることを皆に思い出させたいと思います。これは常に非同期で(バックグラウンドスレッドで)行う必要がありますが、質問は同期メソッドを要求するため、ここで行う方法を説明することは範囲外です


おそらくメソッドを見てください:

+ stringWithContentsOfURL:encoding:errorドキュメント

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

Swift 2.2への更新された@DCMaxxの回答:

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

よりコンパクトな機能例

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

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

これがSwift2への行き方です:

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

また、以前の回答に関連するextraとして:
Swift2は、プログラマが読むためのより明確なコードを生成する新しいエラー処理アプローチを導入し、NSErrorsを渡す_&_のような複雑さを排除することに注意してください。 、すべてのエラーを確実にキャッチすることにより、安全性が向上します。

_try!_を使用するのは、呼び出しが失敗しないことを100%確信している場合のみです。

さらに読む:https://www.hackingwithswift.com/new-syntax-Swift-2-error-handling-try-catch

3
Javier Cadiz