Получить HTML контент после его загрузки - PullRequest
1 голос
/ 29 апреля 2020

У меня есть Share Extension, в котором я получаю HTML, например:

@objc func actionButtonTapped(){

        var html: String?

        if let item = extensionContext?.inputItems.first as? NSExtensionItem,
            let itemProvider = item.attachments?.first,
            itemProvider.hasItemConformingToTypeIdentifier("public.url") {
            itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in
                if (url as? URL) != nil {

                    html = (self.getHTMLfromURL(url: url as? URL))

                    self.doStuff(html: html)
                }
            }
        }
}

Проблема:

Я получаю HTML но не полный контент. Как получить полный HTML - content веб-сайта?

Обновление:

Причина в том, что я хотел бы чтобы очистить price любого продукта, но на некоторых сайтах price не загружен в первый HTML-get ...

Эта ссылка является хорошим примером. Если вы нажмете на цену и осмотрите ее, вы увидите, что она находится в class current-price. Однако, если я получу HTML описанным выше способом, это class не будет отображено.

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Эта функция найдет HTML из строки URL в фоновом потоке (чтобы не блокировать ваш пользовательский интерфейс), после обработки вы можете обновить свой пользовательский интерфейс в основном потоке:

func getHtml(_ urlString: String, completion: @escaping (String?, Error?) -> Void) {
    DispatchQueue.global(qos: .userInitiated).async(execute: {
        guard let url = URL(string: urlString) else {
            print("URLError: \(urlString) doesn't seem to be a valid URL")
            return completion(nil, URLError.init(URLError.Code.badURL))
        }

        do {
            let html = try String(contentsOf: url, encoding: .ascii)
            print("HTML: \(html)")
            return completion(html, nil)
        } catch let error {
            print("Error: \(error)")
            return completion(nil, error)
        }
    })
}

Использование:

getHtml("https://www.google.com", completion: { html, error in
    if let e = error {
        print(e)
        // handle your error
        return
    }
    print(html as Any)
    DispatchQueue.main.async {
        //update your UI on the main thread
    }
})

ОБНОВЛЕНИЕ:

Вы действительно должны очищать веб-контент на стороне сервера. iOS не позволит вам сделать это без представления WKWebView.

В iOS вам потребуется загрузить javascript в функцию didFini sh WKWebView, если вам нужны такие данные, как Chrome Функция «Осмотреть»:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    let doc = webView.evaluateJavaScript("document.documentElement.outerHTML", completionHandler: { html, error in
        print(html)
    })
}
0 голосов
/ 02 мая 2020

Вот пример использования URLSession и URLRequest:

func retrieveHTML(from url: URL, completion: @escaping (String) -> Void) {
    let request = URLRequest(url: url)
    let session = URLSession(configuration: .ephemeral)
    let task = session.dataTask(with: request) { (data, response, error) in
        guard let data = data, error == nil else {
            print("Data not found, error encountered: \(error!)")
            return
        }

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
            let code = httpStatus.statusCode

            if code >= 400 {
                // You can do more here with these codes, but for sake of this example, we'll return
                print("Received error code from HTTP Response. Code: \(code)")
                return
            }

            if code == 301 || code == 302 {
                // You should update the incoming URL as it is moving, but early return not needed
                print("You could log this error here if desired")
            }
        }

        if let responseString = String(data: data, encoding: .utf8) {
            print("Data found, encoded as string")
            completion(responseString)
        }
    }
    task.resume()
}

Вы все еще можете столкнуться с ошибками, когда страница загружена не полностью, в зависимости от того, как отображается JavaScript на странице. Это должно, по крайней мере, указать вам правильное направление.

0 голосов
/ 01 мая 2020

Сколько я получаю, есть проблема загрузки клиентской стороны Javascript, для этого будет полезно, если вы используете Promise для этого.

PS - посмотрите, если это полезно Клиентский веб-доступ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...