如何从 HTML 中取出某 JS 变量?

           }
        </script>
        <script nonce="1Teo6dnz69YW0soIPJ1sXg">
            if (window.ytcsi) {
                window.ytcsi.tick('pdc', null, '');
            }
        </script>
        <script nonce="1Teo6dnz69YW0soIPJ1sXg">
            var ytInitialData = {
                "responseContext": {
                    "serviceTrackingParams": [{
                        "service": "CSI",
                        "params": [{
阅读 1.6k
avatarAI BotBETA

从HTML中提取JavaScript变量是一个比较复杂的过程,因为HTML文档和JavaScript代码是动态执行的,而JavaScript变量是在浏览器中存储的,无法直接从HTML源代码中获取。

然而,你可以通过在浏览器中使用开发者工具(例如Chrome的DevTools)来查看和提取这些变量。以下是步骤:

  1. 打开你想要检查的网页。
  2. 按F12键或右键点击页面并选择"检查"来打开开发者工具。
  3. 在开发者工具中,找到"Sources"或"资源"选项卡。
  4. 在左侧的导航栏中,展开"Script"或"脚本"部分,这将显示当前加载的所有脚本文件。
  5. 找到包含你想要提取的变量的脚本文件,并打开它。
  6. 在脚本文件中,找到包含变量的代码行。你可以使用搜索功能(通常通过按下Ctrl + F或Cmd + F)来快速定位变量。
  7. 将鼠标悬停在变量上,你将看到一个显示变量值的工具提示。你也可以直接在代码编辑器中查看变量的值。

请注意,这种方法只能在你具有访问网页源代码和JavaScript代码的情况下使用。如果你没有权限访问这些资源,那么你可能无法提取这些变量。

1 个回答

分类讨论 硬编码值(Hardcoding环境依赖值(Environment-Specific

简单先陈述一下,按照题主展示的那一部分的代码情况:
如果要获取 对象数据 推荐使用 2.词法分析
如果要获取 window 等运行时才存在的变量 只能 使用 3.环境编译
如果嫌麻烦,可以直接使用最后一种方法,因为是实际运行后获取数值的,所以也是最 通用的

那么下面开始具体分析方案

硬编码

即在静态的代码中定义的变量,这种相对容易获取,使用词法分析、正则或者其他字符串匹配方法都可以(相对推荐的是 词法分析框架 ,比如 slimit

1.正则(简单情况)

字符串匹配,不适合应对代码复杂的情况,但捕获简单的赋值语句还是相对容易的:

import re

js_code = """
var example = "Hello, world!";
let anotherExample = 123;
const MY_CONSTANT = true;
"""

# 匹配 JavaScript 的变量赋值
matches = re.findall(r'(var|let|const)\s+(\w+)\s*=\s*([^;]+);?', js_code)

# 输出提取的变量名和值
for match in matches:
    print(f"Type: {match[0]} - Name: {match[1]} - Value: {match[2]}")

最终的输出结果是:

Type: var - Name: example - Value: "Hello, world!"
Type: let - Name: anotherExample - Value: 123
Type: const - Name: MY_CONSTANT - Value: true

2.词法分析

这种方式会真正意义上去 解析 js 代码,抽象为 AST 语法树,从而应对复杂情况,比如 slimit 框架

这种情况比较适用于捕获复杂的数据类型或者在复杂语句结构里的变量

from slimit.parser import Parser
from slimit.visitors.nodevisitor import ASTVisitor

text = """
 var x = {
     "key1": "value1",
     "key2": "value2"
 };
 """


class MyVisitor(ASTVisitor):
    def visit_Object(self, node):
        """Visit object literal."""
        for prop in node:
            left, right = prop.left, prop.right
            print('Property key=%s, value=%s' % (left.value, right.value))
            # visit all children in turn
            self.visit(prop)


parser = Parser()
tree = parser.parse(text)
visitor = MyVisitor()
visitor.visit(tree)

环境依赖(通用)

如果需要捕获一些运行时才存在的值,比如 windows 对象,BOMDOM 等浏览器接口,那上述做法都没办法生效了

只能考虑运行一下本地浏览器环境获取(比如通过 selenium),使用前记得注意浏览器驱动与浏览器版本,还有 selenium 的版本,我的是 4.1.1

<script>
    window.forTest = 10;
    let num = 2;
</script>
from selenium.webdriver.chrome.options import Options
from selenium import webdriver

# 我的谷歌浏览器不在默认路径,所以需要配置,其他浏览器也有配置方案,参考官方文档即可
chrome_path = r'D:\Google\Chrome\Application\chrome.exe'
o = Options()
o.binary_location = chrome_path
driver = webdriver.Chrome(options=o)
# 可以是绝对路径,也可以是 url
driver.get("file:///xxx.html")

# 获取 JavaScript 运行环境中的变量
window_forTest = driver.execute_script("return window.forTest;")
u = driver.execute_script("return u;")
print(window_forTest)
print(u)

driver.quit()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进