Веб-захват текста в Swift

Я пытался получить текстовое содержимое любой веб-страницы через:

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
}

Я пробовал варианты этого кода, опубликованные в Интернете, такие как "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, не должно быть?

1 ответ

Я понял, что:

  • моя ошибка в первой проблеме заключалась в том, что myWKWebView.evaluateJavaScript является асинхронной функцией, т.е. она сразу же возвращается с content="" (без времени для установки этой переменной). Решение состоит в том, чтобы обработать содержимое переменной "content" внутри ее тела внутри метода.

  • WKwebViews принимают метод copy(), но не реализуют его: реализовать его должны разработчики. Я где-то читал, что это делается через интерфейс javascript-swift...

В любом случае, первое решение у меня работает.

Другие вопросы по тегам