V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
KevinDo2
V2EX  ›  问与答

如何获取 html 里指定 script 的指定内容?

  •  
  •   KevinDo2 · 2023 年 5 月 8 日 · 1089 次点击
    这是一个创建于 999 天前的主题,其中的信息可能已经有所发展或是发生改变。

    获取到某网站的源 html 内容,里面有很多 Script 标签。 其中一个 Script 标签执行了为变量赋值的操作。

     <script>
          foo.jsonData = {"name":"Bar"}
     </script>
    

    请问有什么合理且高效的办法获取{"name":"Bar"}这个内容?

    5 条回复    2023-05-09 14:44:51 +08:00
    kernelpanic
        1
    kernelpanic  
       2023 年 5 月 8 日   ❤️ 1
    ```
    html.match(/foo.jsonData = (\{[^}]+})/)[1]
    ```
    suckinbottle
        2
    suckinbottle  
       2023 年 5 月 9 日
    jazzg62
        3
    jazzg62  
       2023 年 5 月 9 日
    ```ts
    import { parse } from '@babel/parser';
    import traverse from '@babel/traverse';
    import generator from '@babel/generator';
    import * as types from '@babel/types';
    let obj = 'foo';
    let pro = 'jsonData';
    let script = `let foo = {}
    foo.jsonData = {"name":"Bar"}
    foo.aa = '123';
    `;
    let ast = parse(script, { sourceType: 'script' });
    let res = '';
    traverse(ast, {
    AssignmentExpression(path) {
    let node = path.node;
    if(types.isMemberExpression(node.left) ){
    let object = node.left.object;
    let property = node.left.property;
    if(types.isIdentifier(object) && object.name == obj && types.isIdentifier(property) && property.name == pro){
    res = generator(node.right).code;
    }
    }
    },
    });

    console.log(res);
    ```
    jazzg62
        4
    jazzg62  
       2023 年 5 月 9 日
    也可以用上面 ast 的形式来查找 foo.jsonData 的赋值操作
    KevinDo2
        5
    KevinDo2  
    OP
       2023 年 5 月 9 日
    @jazzg62 学到了!
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1961 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:15 · PVG 13:15 · LAX 21:15 · JFK 00:15
    ♥ Do have faith in what you're doing.