使用 evaluateJavascript 从 WKWebView 获取 HTML,然后将其存储在变量中(使用 Swift)

Posted

技术标签:

【中文标题】使用 evaluateJavascript 从 WKWebView 获取 HTML,然后将其存储在变量中(使用 Swift)【英文标题】:Grab HTML from WKWebView using evaluateJavascript and then store it in a variable (using Swift) 【发布时间】:2018-09-02 01:44:35 【问题描述】:

我让用户使用WKWebView 登录网站,之后我想解析页面的html。我对Swift/ios Development 非常陌生(只是边学习边学习)。我知道 HTML 标记的id 我正在尝试获取(id 为“dataGrid”)的innerHTML,并希望将字符串存储在名为htmlString 的变量中。我有以下代码:

var htmlString = "initial value"
webView.evaluatejavascript("document.getElementById('dataGrid').innerHTML.toString()", 
    completionHandler:  (html: Any?, error: Error?) in htmlString = html as! String)
print(htmlString)

显然这不起作用 - 最后一个 print 语句只打印“初始值”。请注意,我的代码基于另一个 *** 帖子 (Get HTML from WKWebview in Swift) 中描述的方法。在一个中,完成处理程序有一个打印语句,它实际上用于打印HTML。但是,我不太了解完成处理程序,考虑到我还没有太多使用 Swift 的经验,这是有道理的,但这也意味着我不知道如何根据自己的目的调整该帖子中的代码.如果有人能指引我正确的方向,我将不胜感激,这样我就可以将页面的HTML 存储为string 一个变量,以便以后进行变异。谢谢!

【问题讨论】:

您引用的代码对完成处理程序进行了打印调用。你为什么把它移出完成处理程序?询问是因为这正是导致您的代码无法按预期工作的原因。 我只是想在之后看看 htmlString 的值。我的最终目标是从 HTML 中提取信息。 然后将打印保存在完成处理程序中。并在那里添加处理。 【参考方案1】:

htmlString 的值是“初始值”,因为块是在 print 语句被执行之后执行的!

如果您在块内打印 htmlString,您可以看到实际值。您必须在完成块内完成您的任务。此外,完成块将在主线程中执行,因此您需要确保不会阻塞主线程。

【讨论】:

谢谢!!!!所以本质上我需要解析 HTML 并在完成处理程序本身中提取我想要的数据? 是的!你说的对!如果您觉得答案有帮助,请点赞并接受它作为答案。 @ShardulJoshi - 能否请您也投票(通过单击 ^),以便其他人会发现此答案更有帮助。 我确实投了赞成票,但我没有足够的声誉让它公开出现 哦!我明白了,没关系!感谢您的努力!

以上是关于使用 evaluateJavascript 从 WKWebView 获取 HTML,然后将其存储在变量中(使用 Swift)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用evaluateJavaScript 将数据从WKWebview 发送到HTML 文件| iOS | Objective-C

使用 evaluateJavascript 处理来自 Android WebView 的 Promise

WKWebView evaluateJavaScript 不返回 html

WKWebview evaluateJavascript 不工作,抛出错误

evaluateJavascript 是如何工作的?

使用 EvaluateJavaScript 单击按钮的意外行为