ios - 使用 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 的方法。任何帮助将不胜感激!!!!
解决方案
推荐阅读
- java - 您可以完全或在其内部重用 CompletableFuture 对象吗?CompletableFuture 中的一劳永逸
- next.js - react-google-recaptcha 未捕获的类型错误
- python - 烧瓶 HTTP/1.1" 302
- javascript - 如何在凹痕块中执行循环?
- javascript - 如何将动态生成的 DOM 元素的递归部分附加到其父元素?
- azure-devops - 无法将托管服务标识 (MSI) 用于托管 Microsoft 代理的应用服务部署?
- c# - TCP 连接卡在 CLOSE_WAIT 状态
- python - 绘制带有掩码值的数据时,Streamplot 失败
- javascript - 如何使用 NodeJS 更新 JSON 中的特定值并将其存储回变量中
- amazon-web-services - 更改 AWS Glue Pyspark 中的分隔符