0

我一直在尝试通过以下方式获取任何网页的文本内容:

func getTextContentFromUrl (url: URL) -> String? {
    var content = ""
    do {
       content = try String(contentsOf: url)
    } catch {
       return nil
    }
    return content
}

如果网页包含 html/body 标记内的文本,它可以正常工作,但如果网页仅包含 javascript,则不会,例如:https ://twitter.com/search?q=tesla&src=typed_query

我知道 Swifter,但我无法编写数百个 API 来访问任何 WEB 站点:twitter、facebook、linkedin、quora、amazon 等。显然,WKWebView 视图知道如何显示和打印它们的文本,因此我试图获取文本来自 WKWebView 的内容:

(1) 不幸的是,即使我从 webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) 调用它,以下方法总是返回“”:

func getTextContentFromWebView () -> String {
    var content = ""
    myWKWebView.evaluateJavaScript("document.documentElement") { (string, error) in
        if string != nil {
            content = string as! String
        }
    }
    return content
}

我尝试了在 WEB 上发布的这段代码的变体,例如“document.body.textContent”、“document.body.innerText”、“document.body.outerHTML”、“document.body.innerHTML”,但是这个方法总是返回“”……

(2) 我也尝试使用剪贴板来获取文本内容(myWKWebView.SelectAll()、myWWKWebView.copy()),但是 myWKWebView.copy() 总是发送异常(即使这个方法应该适用于任何 NSView,如 Apple 的文档所述):

2020-03-13 15:21:26.251341+0100 Text Miner[7313:603242] -[WKWebView copyWithZone:]: unrecognized selector sent to instance 0x101b815c0

如果任何人都可以通过任何网络浏览器手动复制和粘贴和打印任何网页的文本内容,而不管其内容如何(html/javascript),那么应该有一种通用的简单且有记录的方法来从 WKWebView 中获取文本,不应该吗?

4

1 回答 1

0

我发现:

  • 我在第一个问题中的错误是 myWKWebView.evaluateJavaScript 是一个异步函数,即它立即返回 content="" (没有时间设置此变量)。解决方案是在方法内部处理变量“content”的内容。

  • WKwebViews 接受 copy() 方法但不实现它:由开发人员来实现它。我在某处读到它是通过接口 javascript-swift 完成的......

无论如何,第一个解决方案对我有用。

于 2020-05-16T13:06:54.943 回答