我正在解析一个包含多个 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
- 查找带有名为“foo”的 expression.callee.name 的 ExpressionStatement。
- 返回 ExpressionStatement 的 arguments.raw(您需要将“raw”选项设置为 True,请参阅文档)
