2

我正在解析一个包含几个脚本块的 HTML 页面:

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

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

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 获取参数,还是应该使用正则表达式?

4

2 回答 2

3

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,请参阅文档)
于 2013-09-24T16:22:03.250 回答
0

BeautifulSoup 只关心标签、标签的属性和标签下的标签子树。从它的角度来看,您的整个 javascript 只是文本。

如果您的 javascript 代码确实受到非常严格的限制,您可以使用正则表达式。
但是,如果它再复杂一点,那可能就是通往地狱的道路。

合乎逻辑的步骤是使用 javascript 解析器。Python 之一(pyesprima)或您通过进程间通信提供和询问的任何其他。

于 2013-09-24T16:21:12.333 回答