首页 > 解决方案 > 使用 WKWebView swift 获取动态加载的 html

问题描述

我一直在尝试从具有动态/延迟加载的网站加载 HTML。到目前为止,我看到的唯一解决方案是使用 WebView,然后DispatchQueue.main.asyncAfter(deadline: .now() + 2.0)在调用该evaluateJavaScript方法之前使用延迟 ()。见下文:

import SwiftSoup
import WebKit

private let myWebView: WKWebView = {
    let prefs = WKPreferences()
    let config = WKWebViewConfiguration()
    config.preferences = prefs
    let webView = WKWebView(frame: .zero, configuration: config)
    return webView
}()

var allProducts: [Element] = []

override func viewDidLoad() {
    super.viewDidLoad()

    myWebView.navigationDelegate = self  
      
    let myURL = URL(string: "https://shop.coles.com.au/a/national/specials/search/coles-weekly-specials?pageNumber=1")
    myWebView.load(URLRequest(url: myURL!))

}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        
        myWebView.evaluateJavaScript("document.body.innerHTML") { [self]  result, error in        

            guard let htmlContent = result, error == nil else {
                print("error")
                return
            }
            
            do {
                let doc = try SwiftSoup.parse(htmlContent as! String)
                       
                allProducts = try doc.select("header").array()

            } catch {
                print("error")
            }
        }

    }
        
}

这样做的问题是,有一个固定的延迟是非常危险/低效的,因为它可能不会加载所有数据或者它可能会浪费时间。我虽然在代码上实现了一个 while 循环,以便它重复评估,直到找到数据(见打击):

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    while allProducts.count < 1 {
        myWebView.evaluateJavaScript("document.body.innerHTML") { [self]  result, error in

            guard let htmlContent = result, error == nil else {
                print("error")
                return
            }
            
            do {
                let doc = try SwiftSoup.parse(htmlContent as! String)
                       
                allProducts = try doc.select("header").array()

            } catch {
                print("error")
            }
        }
    }
        
}

但是当我运行它时,控制台的反应非常出乎意料,我认为它甚至没有运行一次评估代码。我假设您不能evaluateJavaScript在特定负载上多次调用该方法。

有谁知道此代码的任何解决方法,或任何其他加载动态加载的 HTML 的方法。任何帮助将不胜感激!!!!

标签: iosswiftdynamichtml-parsingwkwebview

解决方案


推荐阅读