我正在使用多个脚本块解析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获取参数,还是应该使用正则表达式?
答案 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 :(得分:0)
BeautifulSoup仅关注标签的标签,标签属性和标签下的标签子树。 从它的角度来看,你的整个javascript只是文本。
如果你的javascript代码确实受到非常严格的限制,你可以使用正则表达式 如果它甚至更复杂一点,那可能是通往地狱的道路。
然后,逻辑步骤是使用javascript解析器。 Python one(pyesprima)或您提供的任何其他内容 通过进程间通信询问。