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

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

  •  
  •   KevinDo2 · 2023-05-08 21:31:31 +08:00 · 748 次点击
    这是一个创建于 566 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    5 条回复    2023-05-09 14:44:51 +08:00
    kernelpanic
        1
    kernelpanic  
       2023-05-08 21:45:24 +08:00   ❤️ 1
    ```
    html.match(/foo.jsonData = (\{[^}]+})/)[1]
    ```
    alukongfu
        2
    alukongfu  
       2023-05-09 09:34:07 +08:00
    jazzg62
        3
    jazzg62  
       2023-05-09 11:23:25 +08:00
    ```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-05-09 11:24:56 +08:00
    也可以用上面 ast 的形式来查找 foo.jsonData 的赋值操作
    KevinDo2
        5
    KevinDo2  
    OP
       2023-05-09 14:44:51 +08:00
    @jazzg62 学到了!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3396 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:51 · PVG 19:51 · LAX 03:51 · JFK 06:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.