Извлечь значение переменной в коде JavaScript из HTML - PullRequest
0 голосов
/ 17 января 2019

Я получаю HTML-код веб-страницы с помощью этой библиотеки синтаксического анализа, которая называется Kanna . В основном урезанная версия выглядит следующим образом.

<!DOCTYPE html>
<html lang="en" class="no-js not-logged-in client-root">

<head>
    <meta charset="utf-8">
</head>

<body>

    <script type="text/javascript">
        window._sharedData = { 
            // Some JSON
        };
    </script>

    <script type="text/javascript">
        // Javascript code
    </script>

    <script type="text/javascript">
        // More Javascript code
    </script>

</body>

</html>

В body имеется несколько тегов script. Я хочу получить доступ к переменной с именем window._sharedData и извлечь ее значение, которое является словарем JSON.

Я пытался использовать регулярные выражения, но он возвращает nil. Может, что-то не так с моим рисунком?

if let doc = try? HTML(url: mixURL, encoding: .utf8), let body = doc.body, let htmlText = body.text {  

    let range = NSRange(location: 0, length: htmlText.utf8.count)
    let regex = try! NSRegularExpression(pattern: "/<script type=\"text/javascript\">window._sharedData = (.*)</script>/")
    let s = regex.firstMatch(in: htmlText, options: [], range: range)
    print(s)

}

Или есть лучший способ сделать это?

1 Ответ

0 голосов
/ 17 января 2019

Вот оно:

import Foundation
import Kanna

let htmlString = "<!DOCTYPE html><html lang=\"en\" class=\"no-js not-logged-in client-root\"><head> <meta charset=\"utf-8\"></head><body> <script type=\"text/javascript\"> window._sharedData = { \"string\": \"Hello World\" }; </script> <script type=\"text/javascript\"> </script> <script type=\"text/javascript\"> </script></body></html>"

guard let doc = try? HTML(html: htmlString, encoding: .utf8) else { print("Build DOM error"); exit(0) }

let body = doc.xpath("//script")
            .compactMap { $0.text }
            .filter { $0.contains("window._sharedData") }
            .map { $0.replacingOccurrences(of: " window._sharedData = ", with: "") }
            .map { $0.dropLast(2) }
            .first

print("body: ", body) 
// body:  Optional("{ \"string\": \"Hello World\" }")

После этого вы можете проверить, что тело не ноль и готов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...