代码之家  ›  专栏  ›  技术社区  ›  Isuru PapaSmurf

从HTML中提取JavaScript代码中的变量值

  •  0
  • Isuru PapaSmurf  · 技术社区  · 7 年前

    我正在使用这个名为 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>
    

    有多个 script 标签在 body .我想访问名为 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 回复  |  直到 7 年前
        1
  •  0
  •   Sergey Didanov    7 年前

    这是:

    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\" }")
    

    之后,你可以检查身体,而不是零,准备好了吗