2012-11-08 14 views
10

BeautifulSoupとRequestsを使用していくつかのウェブサイトをスクラップしています。私が調べているページには、<script language="JavaScript" type="text/javascript">タグ内にそのデータがあります。それは次のようになります。Pythonを使用してjavascriptタグから変数データを解析する

<script language="JavaScript" type="text/javascript"> 
var page_data = { 
    "default_sku" : "SKU12345", 
    "get_together" : { 
     "imageLargeURL" : "http://null.null/pictures/large.jpg", 
     "URL" : "http://null.null/index.tmpl", 
     "name" : "Paints", 
     "description" : "Here is a description and it works pretty well", 
     "canFavorite" : 1, 
     "id" : 1234, 
     "type" : 2, 
     "category" : "faded", 
     "imageThumbnailURL" : "http://null.null/small9.jpg" 
     ...... 

私はこのスクリプトタグ内page_data変数のうちPythonの辞書やJSONオブジェクトを作成することができる方法はありますか?それは、BeautifulSoupで値を取得しようとするよりはるかに良いでしょう。あなたが<script>タグの内容を取得するためにBeautifulSoupを使用する場合は

答えて

22

は、json moduleは、文字列の魔法のビットと残りの部分を行うことができます。

jsonValue = '{%s}' % (textValue.split('{', 1)[1].rsplit('}', 1)[0],) 
value = json.loads(jsonValue) 

.split().rsplit()コンボは、上記の最初の{上のテキストを分割JavaScriptのテキストブロックの最後の}にあります。これはオブジェクト定義である必要があります。中括弧をテキストに追加することで、json.loads()にそれを送り、そこからpython構造体を得ることができます。

デモンストレーション:

>>> import json 
>>> textValue = ''' 
... var page_data = { 
... "default_sku" : "SKU12345", 
... "get_together" : { 
...  "imageLargeURL" : "http://null.null/pictures/large.jpg", 
...  "URL" : "http://null.null/index.tmpl", 
...  "name" : "Paints", 
...  "description" : "Here is a description and it works pretty well", 
...  "canFavorite" : 1, 
...  "id" : 1234, 
...  "type" : 2, 
...  "category" : "faded", 
...  "imageThumbnailURL" : "http://null.null/small9.jpg" 
... } 
... }; 
... ''' 
>>> jsonValue = '{%s}' % (textValue.split('{', 1)[1].rsplit('}', 1)[0],) 
>>> value = json.loads(jsonValue) 
>>> value 
{u'default_sku': u'SKU12345', u'get_together': {u'category': u'faded', u'canFavorite': 1, u'name': u'Paints', u'URL': u'http://null.null/index.tmpl', u'imageThumbnailURL': u'http://null.null/small9.jpg', u'imageLargeURL': u'http://null.null/pictures/large.jpg', u'type': 2, u'id': 1234, u'description': u'Here is a description and it works pretty well'}} 
>>> import pprint 
>>> pprint.pprint(value) 
{u'default_sku': u'SKU12345', 
 u'get_together': {u'URL': u'http://null.null/index.tmpl', 
                   u'canFavorite': 1, 
                   u'category': u'faded', 
                   u'description': u'Here is a description and it works pretty well', 
                   u'id': 1234, 
                   u'imageLargeURL': u'http://null.null/pictures/large.jpg', 
                   u'imageThumbnailURL': u'http://null.null/small9.jpg', 
                   u'name': u'Paints', 
                   u'type': 2}} 
+0

これは本当に素晴らしいですし、理にかなっています。これで助けていただきありがとうございます。 – ajt

+0

私はオブジェクトのキーを示すために引用符を使用しないオブジェクト宣言のためにこれを再利用することができます。 'default_sku:" SKU12345 "、...'それはおそらくちょうど正規表現を取るだろう... – 2rs2ts

+0

@ 2rs2ts:引用符で追加する以前の答えは、[美しいスープを使用してデータを削っている間にhtmlタグの問題](http://stackoverflow.com/a/14122300)を参照してください。有効なJSONを作成します。 –

関連する問題