2016-12-01 10 views
1

私のスクリプトの1つでは、urllib2BeautifulSoupを使ってHTMLページを解析し、<script>タグを読んでいます。PythonでJavascriptを解析する

は、これは私が得るものです:

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

私の目標は、x_data変数でJSONを読み取ることであり、私はそれを正しく行う方法を知りません。 Iのいえ:

  • 文字列に変換し、{最後のために、同じ}への最初の文字を削除
  • のようなもので、正規表現を使用すると、最初のグループ
  • を取ります「{*。}」他に何か?

これらは効率的かどうか、うまくいく方法があるかどうかはわかりません。

あなたは方法が他の方法よりも好ましいと思いますか?私が気づいていない方法はありますか?

アドバイスをいただきありがとうございます。

EDIT:

後のアドバイスは私は正規表現のソリューションを取得するが、私は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 !" 

私は常に持って「エラーを!」。

EDIT2:

re.DOTALLとうまく動作し

+0

https://pypi.org/project/jsonfinder/ –

+0

入力の仕方によって異なります。もしそれが常に 'var x_data = ...'になるのであれば、文字列の先頭にアンカーされたビットを正規表現で置き換えることができます。あなたのソリューションは、JSパーサーを埋め込むのと同じくらい簡単なものから複雑なものまでのどこにでも置くことができます。 –

+0

こんにちは、それは常に 'var x_data = ...'になります。ありがとう、私は今すぐ正規表現の解決策を書いています。 –

答えて

2

{.*}は、.*が貪欲であるため、本質的に同じであると思います。つまり、バックトラッキングがほとんどなく、別のものではより「寛容」ですJSコードのフォーマットのニュアンス)。もっと興味があるのは、https://docs.python.org/3.6/library/json.htmlです。

1

常に正確にこのように見える場合は、提案したようなソリューションをハックすることができます。

プログラマーはすべてのことをコードで実行するので、実際には必ずしも正確にこのように見えることはないと思われ、ハッキリしたソリューションは壊れやすく、予期しない( "不可能な不都合な" (Regexは、コードを解析するときにはハッキリであることが知られています)。

これを正しく実行するには、実際のJavaScriptパーサーを取得し、スクリプトタグのコンテンツで定義されたコード部分に適用してASTを生成し、ASTでJavaScriptネストされた構造JSONのように見えるようにして、その木の内容を前もって印刷します。

JavaScriptの割り当てステートメントを使用してJSONフラグメントをアセンブルするプログラマーの方でも、これは脆弱です。これを処理するには、データフローを計算し、JSONコードをアセンブルするコードセットを発見します。これはむしろたくさんの作業です。

解決策の制限がどのようになるかを決定し、制御しない人が何かをランダムに実行した場合の結果を受け入れるようになります。

+0

うわー。 downvote。 Downvoter、downvotingの理由を説明したいですか?特に、この答えが正しい理由は何ですか? –

+0

私はdownvoteをしませんでしたが、 "それは常に' var x_data = .... 'になると仮定します。"(http://stackoverflow.com/questions/40915646/parsing-javascript-with-python/40915808#comment69043750_40915646)コード構造はかなり固定されているはずです。 –

+0

これは、OPが彼がそうすることができる範囲で主張し実施するためのものです。もし彼が本当にこれを強制することができれば、彼は安全にハックすることができます。私はそれが非常に悪い賭けだと思う​​。すべてのコードが特定のスタイルに基づいて書かれているという私の経験は、私に言う人はコードを書いた人ではなく、ただ自分自身と私に嘘をついているだけで、偽であることが判明した。私はここで多くの経験があります。 –

関連する問題