13

BeautifulSoupとRequestsを使用していくつかのWebサイトをスクレイピングしています。私が調べているページの1つに、<script language="JavaScript" type="text/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で値を取得しようとするよりもはるかに良いでしょう。

4

1 に答える 1

24

BeautifulSoupを使用して<script>タグの内容を取得する場合、jsonモジュールは残りの部分を文字列の魔法で実行できます。

 jsonValue = '{%s}' % (textValue.partition('{')[2].rpartition('}')[0],)
 value = json.loads(jsonValue)

上記の.partition()andコンボは、JavaScriptテキストブロックの最初と最後.rpartition()のテキストを分割します。これは、オブジェクト定義である必要があります。テキストに中かっこを追加することで、テキストをフィードしたり、Python構造を取得したりできます。{}json.loads()

これが機能するのは、JSONが基本的にJavascriptリテラル構文オブジェクト、配列、数値、ブール値、およびnullであるためです。

デモンストレーション:

>>> import json
>>> text = '''
... 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"
...    }
... };
... '''
>>> json_text = '{%s}' % (text.partition('{')[2].rpartition('}')[0],)
>>> value = json.loads(json_text)
>>> value
{'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'}}
>>> import pprint
>>> pprint.pprint(value)
{'default_sku': 'SKU12345',
 'get_together': {'URL': 'http://null.null/index.tmpl',
                  'canFavorite': 1,
                  'category': 'faded',
                  'description': 'Here is a description and it works pretty '
                                 'well',
                  'id': 1234,
                  'imageLargeURL': 'http://null.null/pictures/large.jpg',
                  'imageThumbnailURL': 'http://null.null/small9.jpg',
                  'name': 'Paints',
                  'type': 2}}
于 2012-11-08T21:36:34.867 に答える