Skip to main content
 首页 » 编程设计

python之使用 BeautifulSoup 从 HTML 页面中提取 JavaScript 函数的参数

2024年08月28日36kenshinobiy

我正在解析一个包含多个 script block 的 HTML 页面:

<script type="text/javascript"> 
    // some code 
</script> 
<script type="text/javascript"> 
    foo(arg1, arg2); 
    // some code 
</script> 

我需要提取 foo 函数的参数 - 'arg1' 和 'arg2'。目前我可以获得script标签的内部内容:

def parse_foo(pageContent): 
    soup = BeautifulSoup(pageContent) 
    scriptTags = soup.find_all('script') 
    for script in scriptTags: 
        tagContent = script.get_text() 
        if tagContent.count('foo') > 0: 
            return tagContent 
    return '' 

有什么方法可以使用 BeautifulSoup 获取参数,还是应该使用正则表达式?

请您参考如下方法:

pyesprima是 Esprima 的一个端口,“一个用 ECMAScript 编写的高性能、符合标准的 ECMAScript 解析器”。幸运的是,它易于使用。不幸的是,它有点慢。

甚至还有一个在线解析器工具可供使用:http://esprima.org/demo/parse.html

当我输入 foo(arg1,arg2); 时,返回:

{ 
    "type": "Program", 
    "body": [ 
        { 
            "type": "ExpressionStatement", 
            "expression": { 
                "type": "CallExpression", 
                "callee": { 
                    "type": "Identifier", 
                    "name": "foo" 
                }, 
                "arguments": [ 
                    { 
                        "type": "Identifier", 
                        "name": "arg1" 
                    }, 
                    { 
                        "type": "Identifier", 
                        "name": "arg2" 
                    } 
                ] 
            } 
        } 
    ] 
} 

树:

                ExpressionStatement 
                        | 
                   expression 
                 /      |     \ 
type=callExpression   callee   arguments 
                        |        
                    name=foo   
  1. 查找带有名为“foo”的 expression.callee.name 的 ExpressionStatement。
  2. 返回 ExpressionStatement 的 arguments.raw(您需要将“raw”选项设置为 True,请参阅文档)