Regex 用Python解析Javascript

Regex 用Python解析Javascript,regex,parsing,beautifulsoup,Regex,Parsing,Beautifulsoup,在我的一个脚本中,我使用URLLIB2和BeautifulSoup解析HTML页面并读取标记 这就是我得到的: <script> var x_data = { logged: logged, lengthcarrousel: 2, products : [ { "serial" : "106541823" ... </script> 我总是出错 编辑2: 与re.DOTALL配合得很

在我的一个脚本中,我使用URLLIB2和BeautifulSoup解析HTML页面并读取标记

这就是我得到的:

<script>
var x_data = {
    logged: logged,
    lengthcarrousel: 2,
    products : [
        {
            "serial" : "106541823"
            ...
</script>
我总是出错

编辑2:


与re.DOTALL配合得很好。

我认为这些方法在优雅性和性能方面基本相同,使用{.*}可能会稍微好一点,因为.*是贪婪的,即几乎没有回溯,而且在我看来,它更能原谅不同JS代码格式的细微差别。您可能更感兴趣的是:。

我认为这些方法在优雅性和性能方面基本相同,使用{.*}可能会稍微好一点,因为.*是贪婪的,即几乎没有回溯,因为在我看来,它更能原谅不同JS代码格式的细微差别。您可能更感兴趣的是:。

如果它总是看起来像这样,那么您可以根据您提出的解决方案,根据它看起来像这样

因为程序员在代码中做所有事情,我怀疑在实践中它并不总是这样,然后任何黑客解决方案都将是脆弱的,并且会在意想不到的阅读不方便的时刻失败。众所周知,正则表达式在解析代码时很难处理

如果您想正确地执行此操作,则需要获得一个真正的JavaScript解析器,将其应用于由脚本标记内容定义的代码片段,以生成AST,然后在AST中搜索恰好看起来像JSON的JavaScript嵌套结构,并获取该树的内容,预打印

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


因此,你可以决定你的解决方案的限制,然后接受当你无法控制的人做了一些随机的事情时所产生的后果。

如果它总是看起来像这样,那么你可以根据它看起来完全像这样来破解你提出的解决方案

因为程序员在代码中做所有事情,我怀疑在实践中它并不总是这样,然后任何黑客解决方案都将是脆弱的,并且会在意想不到的阅读不方便的时刻失败。众所周知,正则表达式在解析代码时很难处理

如果您想正确地执行此操作,则需要获得一个真正的JavaScript解析器,将其应用于由脚本标记内容定义的代码片段,以生成AST,然后在AST中搜索恰好看起来像JSON的JavaScript嵌套结构,并获取该树的内容,预打印

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


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

取决于输入如何变化。如果它总是var x_data=…,您可以用正则表达式替换锚定到字符串开头的位。您的解决方案可能介于简单到复杂到嵌入JS解析器之间。。。。谢谢,我正在编写regexp解决方案。@JohnMath您不应该使用多行匹配。只需将匹配定位到字符串的开头,就不需要搜索字符串中的任何地方。@JohnMath取决于输入的变化。如果它总是var x_data=…,您可以用正则表达式替换锚定到字符串开头的位。您的解决方案可能介于简单到复杂到嵌入JS解析器之间。。。。谢谢,我正在编写regexp解决方案。@JohnMath您不应该使用多行匹配。只要在字符串的开头做一个定位匹配,就不需要搜索字符串中的任何地方。@JohnMath-Wow。否决票。Downvoter,您愿意解释您的Downvoter原因吗,特别是为什么这个答案不正确?我没有Downvoter,但假设它始终是var x_data=。。。。那么代码结构应该是相当固定的,这是OP可以断言和执行的。如果他真的能做到这一点,那么他就能安全地离开。我认为这是一个非常糟糕的赌注。我的经验是,有人告诉我,他们所有的代码都是按照特定的风格编写的,告诉我的人不是编写代码的人,他们只是在对自己和我撒谎,当结果是错误的时候,他们会让我痛苦。我在这里有很多经验。你当然有,我记得你的na
因为这里有一些关于StackOverflow的极好的答案,所以请告诉我,但毕竟应该假设一些东西。否则:例如,如果要通过网络获取x_数据内容,该怎么办?我认为这不完全是解析的情况,尽管有问题的标题;图灵告诉我们,从代码中提取大部分事实相当于停止问题。诀窍是尽可能少地假设。如果您验证您的假设是正确的,或者验证的次数足够频繁,以便异常是可管理的,那就更好了。我记得与IBM签订了一份源代码合同,经理根据公司法令发誓该源代码是C代码,我们计划使用我们的C解析器;一百万条线出现,其中一半为C++。拥有GCC的程序员根本不在乎公司法令。否决票。Downvoter,您愿意解释您的Downvoter原因吗,特别是为什么这个答案不正确?我没有Downvoter,但假设它始终是var x_data=。。。。那么代码结构应该是相当固定的,这是OP可以断言和执行的。如果他真的能做到这一点,那么他就能安全地离开。我认为这是一个非常糟糕的赌注。我的经验是,有人告诉我,他们所有的代码都是按照特定的风格编写的,告诉我的人不是编写代码的人,他们只是在对自己和我撒谎,当结果是错误的时候,他们会让我痛苦。我在这里有很多经验。当然你有,我记得你的名字是因为这里有关于StackOverflow的一些很好的答案,但毕竟人们应该假设一些东西。否则:例如,如果要通过网络获取x_数据内容,该怎么办?我认为这不完全是解析的情况,尽管有问题的标题;图灵告诉我们,从代码中提取大部分事实相当于停止问题。诀窍是尽可能少地假设。如果您验证您的假设是正确的,或者验证的次数足够频繁,以便异常是可管理的,那就更好了。我记得与IBM签订了一份源代码合同,经理根据公司法令发誓该源代码是C代码,我们计划使用我们的C解析器;一百万条线出现,其中一半为C++。拥有GCC的程序员根本不在乎公司法令。
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 !"