javascript - 从 HTML 中提取 JavaScript 代码中的变量值
问题描述
我正在使用这个名为Kanna的解析库获取网页的 HTML 代码。基本上精简版看起来像这样。
<!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)
}
还是有更好的方法来做到这一点?
解决方案
这里是:
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\" }")
之后你可以检查那个身体不是零并且准备好了
推荐阅读
- c++ - g++ 权限被拒绝(Mac)
- javascript - TypeError:无法读取未定义的属性“findAll”(mariaDB,ExpressJs)
- firebird - 火鸟长满数据库文件
- java - 关闭应用程序时清除警报和作业?
- go - 初始化所有成员都是函数的空接口变量
- vue.js - 如果在 vue-router 中从组件数据中传递多个参数,则无法获取更多数据,只能获取数据的第一个参数
- c++ - 如何获取被调用程序的返回退出值以将其存储在内部?
- c# - 无法在 XAML 中引用自定义 Xamarin PlatformEffect
- web-scraping - 如何从网站跟踪单个用户的行为
- vb.net - How to run VB.NET with X command in SAS through Enterprise