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

时间:2013-09-24 15:12:45

标签: python beautifulsoup

我正在使用多个脚本块解析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获取参数,还是应该使用正则表达式?

2 个答案:

答案 0 :(得分: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,请参阅docs)

答案 1 :(得分:0)

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

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

然后,逻辑步骤是使用javascript解析器。 Python one(pyesprima)或您提供的任何其他内容 通过进程间通信询问。