使用Python解析Javascript

时间:2016-12-01 16:27:24

标签: regex parsing beautifulsoup

在我的一个脚本中,我使用urllib2BeautifulSoup来解析HTML页面并阅读<script>标记。

这就是我得到的:

<script>
var x_data = {
    logged: logged,
    lengthcarrousel: 2,
    products : [
        {
            "serial" : "106541823"
            ...
</script>

我的目标是阅读x_data变量中的JSON,我不知道如何正确地完成它。 我虽然:

  • 转换为字符串并删除第一个字符{和最后一个字符}
  • 使用正则表达式,例如&#39; {。*}&#39;并采取第一组
  • 别的什么?

我不知道这些是否有效,以及是否有其他方法可以很好地完成。

你认为一种方法比另一种更好吗?我可能没有意识到的任何方法?

提前感谢您的任何建议。

编辑:

根据建议,我获得了Regexp解决方案,但是尽管使用了re.MULTILINE,我仍然无法进行多行搜索:

string1 = '<script>
var x_data = {
    logged: logged,
    lengthcarrousel: 2,
    products : [
        {
                "serial" : "106541823"}
]
}; 
</script>'


p = re.compile(r'\{.*\};',re.MULTILINE);
m = p.search(string1)
if m:
    print m.group(0)
else:
    print "Error !"

我总是得到一个&#34;错误!&#34;。

EDIT2:

适用于re.DOTALL

2 个答案:

答案 0 :(得分:2)

我认为这些方法在优雅和性能方面基本相同(使用 {。*} 可能稍好一些,因为。* 是贪婪的,即会几乎没有回溯,因为在我看来,对于不同的JS代码格式细微差别,我更“宽容”。您可能更感兴趣的是: https://docs.python.org/ 3.6 /库/ json.html

&#XA。

答案 1 :(得分:1)

如果它看起来总是这样,那么你就可以像你提出的那样解决一个类似于它的解决方案。

因为程序员在代码中做了所有事情,我怀疑在实践中它不会完全看起来如此,然后任何hacky解决方案都将是脆弱的并且会在意外(阅读&#34;不可能的不方便&#34;)时刻失败。 (在解析代码时,已知正则表达式是hacky)。

如果你想要做到这一点,你需要获得一个真正的JavaScript解析器,将其应用于脚本标记内容定义的代码片段,以生成AST,然后在AST中搜索恰好碰巧的JavaScript嵌套结构看起来像JSON,并获取那棵树的内容,漂亮印刷。

面对使用JavaScript赋值语句汇编JSON片段的程序员,即使这样也很脆弱。您可以通过计算数据流并发现碰巧汇编JSON代码的代码集来处理这个问题。这是相当多的工作。

因此,您可以决定解决方案的限制是什么,然后接受当您无法控制的人随机做某些事情时的后果。