コンテンツにスキップ

Python の JMESPath を使用した JSON 解析の簡単な紹介

ちょっと、そこ! JSON は、急速に現代の Web で最も人気のあるデータ形式になりました。 5 年以上の経験を持つ Web スクレイピングの専門家として、私は JSON がニッチなデータ形式から Web API や Web サイトの共通語に成長するのを見てきました。

この投稿では、JSON データを解析して処理するための便利な Python ライブラリである JMESPath について紹介したいと思います。 JSON の台頭により、JMESPath は私の Web スクレイピング ツールボックスに不可欠なツールになりました。

Python スクリプトや Web スクレイパーで JMESPath を使用できるように、JMESPath がどのように機能するかを実際に見てみましょう。

JSON の急速な台頭

まず、簡単に説明しましょう なぜJSONがこれほど人気になったのか ウェブ上で。 JSON は JavaScript Object Notation の略で、2000 年代初頭に初めて形式化されて以来、着実に人気を集めています。

JSON の採用に関する統計をいくつか示します。

  • オーバー 最新の Web API の 70% データ転送に JSON を使用する
  • ウェブサイトの60% ある程度の容量で JSON データを提供できるようになりました
  • Twitter、Reddit、Facebook などの人気サイトはすべて、 JSONベースのAPI
  • JSON は次のとおりです 4倍人気 Web データ全体では XML よりも

JSON は、JavaScript の組み込みサポート、単純な構文、小さいファイル サイズ、および解析の容易さにより、Web データの頼りになる形式になっています。

私たち Web スクレイパーにとって、これは、必要なデータが生の構造化された JSON ドキュメントでますます利用可能になることを意味します。ただし、この有用なデータの収集は必ずしも簡単ではありません。

JSON はどこにでも存在しますが、サイトからスクレイピングされた生の JSON は次のようなものであることがよくあります。

  • 巨大な – 必要のない大量の余分なデータが含まれています
  • 入れ子になった – 複雑なオブジェクトや配列にデータが埋め込まれている場合
  • 扱いにくい – 簡単に抽出できるフィールドと値が不足している

ここで JMESPath が役に立ちます。

JMESPathとは何ですか?

JMESPath (「ジェームズ パス」と発音) は、JSON データを解析するために特別に設計されたクエリ言語です。

JMESPath を使用して、次の式を記述します。

  • ネストされた JSON フィールドを簡単に選択
  • JSON配列のフィルタリング
  • 複雑な JSON をより単純な構造に再形成する
  • JSON をプログラムで並べ替え、制限、変換する

JMESPath は Amazon (JSON の処理についてはある程度の知識がある!) によって開発され、さまざまなプログラミング言語用に実装されました。

Python の場合は、 jmespath このモジュールは、JMESPath を使用して JSON を解析するためのクリーンな API を提供します。

できることの例をいくつか示します。

  • 選択 JSON ドキュメントの特定のフィールド
  • フィルタ JSON オブジェクトの配列
  • 平らにする ネストされた JSON を単純なリストと値に変換する
  • 変形 JSON データを Python に適した形式に変換する
  • 並び替え および リミット JSON データの配列

JMESPath を使用すると、非常に複雑な JSON を Python で簡単に操作できます。

Python での JMESPath のインストール

JMESPath は、pip を使用して簡単にインストールできます。

pip install jmespath

インストール後、Python スクリプトにインポートします。

import jmespath

これで、JSON の解析を開始する準備が整いました。

JMESPath を使用した JSON のクエリの基本

JMESPath のコアは次のように表現します。 パス JSON ドキュメントをドリルダウンします。

基本的な JMESPath 式の例をいくつか示します。

現在地に最も近い name JSON オブジェクトのフィールド:

data = {‘name‘: ‘John‘, ‘age‘: 30}

jmespath.search(‘name‘, data)
# ‘John‘

JSON オブジェクトのリストからすべての名前を取得します。

data = [
  {‘name‘: ‘John‘, ‘age‘: 30},
  {‘name‘: ‘Sarah‘, ‘age‘: 25}
]

jmespath.search(‘[*].name‘, data)
# [‘John‘, ‘Sarah‘] 

JSON 配列から最初の要素を取得します。

data = {‘hobbies‘: [‘hiking‘, ‘reading‘, ‘coding‘]}  

jmespath.search(‘hobbies[0]‘, data)
# ‘hiking‘

ご覧のとおり、JMESPath は、ドット表記と配列インデックスを備えた JavaScript に似た構文を使用します。

次に、より高度な機能をいくつか見てみましょう。

JSON オブジェクトの配列のフィルタリング

一般的なタスクは、条件に基づいて JSON オブジェクトの配列をフィルタリングすることです。

JMESPath を使用すると、JSON 配列のフィルタリングが簡単になります。

たとえば、年齢に基づいてユーザーをフィルタリングできます。

data = [
  {‘name‘: ‘Sarah‘, ‘age‘: 25},
  {‘name‘: ‘Mark‘, ‘age‘: 19},
  {‘name‘: ‘John‘, ‘age‘: 30}    
]

jmespath.search(‘[?age > `28`].name‘, data) 
# [‘John‘]

  [?age >28] フィルターは、年齢が 28 歳を超える要素を選択します。

文字列、数値、ネストされたオブジェクトなど、JSON データ内のあらゆるものをフィルタリングできます。

JSON データのフラット化と投影

もう 1 つの非常に便利な JMESPath 機能は、JSON をフラット化し、他の形状に投影することです。

たとえば、次を使用して、ネストされた JSON を単純なリストに「フラット化」できます。 [] 投影:

data = {
  ‘product‘: {
    ‘id‘: 123, 
    ‘name‘: ‘Widget‘,
    ‘colors‘: [‘blue‘,‘green‘]    
  }
}

jmespath.search(‘product.[id, name, colors[]]‘, data) 

# [123, ‘Widget‘, ‘blue‘, ‘green‘]

同様に、次を使用して JSON オブジェクトを他の JSON オブジェクトに再形成できます。 {} 投影:

data = {
  ‘product‘: {
    ‘id‘: 123,
    ‘name‘: ‘Super Widget‘,
    ‘price‘: 9.99,
    ‘dimensions‘: {
      ‘length‘: 10,
      ‘width‘: 5     
    }
  }
}

jmespath.search("""
  product.{  
    id: id,
    name: name,     
    price_usd: price,
    length_cm: dimensions.length,
    width_cm: dimensions.width   
  }   
""", data)

# {‘id‘: 123,  
#  ‘name‘: ‘Super Widget‘,
#  ‘price_usd‘: 9.99,
#  ‘length_cm‘: 10,
#  ‘width_cm‘: 5}

プロジェクションを使用すると、複雑なネストされた JSON であっても、Python に役立つリストや辞書などの単純な形式に簡単に再形成できます。

JSON 配列の並べ替え、制限、スライス

JMESPath は、JSON データの配列をラングリングするためのいくつかの便利な方法を提供します。

data = [ 
  {‘name‘: ‘Sarah‘, ‘age‘: 25},
  {‘name‘: ‘Mark‘, ‘age‘: 19},
  {‘name‘: ‘John‘, ‘age‘: 30}
]

# Sort by age
jmespath.search(‘[*].age | sort(@)‘, data)  
# [19, 25, 30]  

# Slice first 2 elements 
jmespath.search(‘[*][:2]‘, data)
# [{‘name‘: ‘Sarah‘, ‘age‘: 25}, {‘name‘: ‘Mark‘, ‘age‘: 19}]

# Limit to 2 elements
jmespath.search(‘[*][0:2]‘, data)    
# [{‘name‘: ‘Sarah‘, ‘age‘: 25}, {‘name‘: ‘Mark‘, ‘age‘: 19}]

これにより、JSON ドキュメントから大きな配列を取得し、必要なビットだけを抽出することができます。

Webスクレイピング用のJMESPath

JMESPath を使用して JSON をクエリする基本を説明したので、Web スクレイピングでの動作を見てみましょう。

この例では、Realtor.com から不動産リスト データを抽出します。必要なデータは、各リスト ページの JSON スクリプト タグ内にあります。

リストの例を次に示します。

https://www.realtor.com/realestateandhomes-detail/335-30th-Ave_San-Francisco_CA_94121_M17833-49194

まず、ページをスクレイピングして JSON スクリプトを取得します。

import requests
from parsel import Selector 

url = "https://www.realtor.com/realestateandhomes-detail/335-30th-Ave_San-Francisco_CA_94121_M17833-49194"

response = requests.get(url)
selector = Selector(text=response.text)

json_data = selector.css(‘script#__NEXT_DATA__::text‘).get()

これにより、次のような JSON オブジェクトが得られます。 数千 すべてのリスト データを含む行数。

ここでほんの一部を覗いてみましょう:

{
  "building": {
    "rooms": {
      "baths": 4,
      "beds": 4,
      "total_rooms": null,
      "room_type": null
    },
    "building_size": {
      "size": 3066,
      "units": null
    }, 
    "parking": {
      "spaces": null,
      "description": null,
      "parking_type": null
    }
   }
   // and lots more!   
}

この巨大なオブジェクトを解析するのではなく、JMESPath を使用して、実際に必要なものだけをクエリすることができます。

import json
import jmespath

data = json.loads(json_data) 

result = jmespath.search("""
  {
    id: listing_id,   
    facts: {
      beds: building.rooms.beds,
      baths: building.rooms.baths,
      sqft: building.building_size.size
    },
    price: list_price  
  }
""", data) 

print(result)

これにより、必要なフィールドだけが出力されます。

{‘id‘: ‘2950457253‘,
 ‘facts‘: {‘beds‘: 4, ‘baths‘: 4, ‘sqft‘: 3066},
 ‘price‘: 2995000} 

JMESPath を使用すると、数千行の JSON を解析して、必要なフィールドだけを含むクリーンな Python 辞書を作成できました。

URL をループし、各反復で JMESPath を使用して JSON を抽出することで、すべてのリストにわたるデータを簡単に収集できるようになりました。

他の JSON パーサーとの比較

Python には他にもいくつかの一般的な JSON 解析オプションがあります。

  • JSONパス – JMESPath に似たクエリ言語ですが、フル機能は劣ります
  • jq – 強力な JSON プロセッサですが、独自の構文を学習する必要があります
  • json.load() – 組み込みの Python JSON パーサーですが、多くのコードが必要です

私の経験では、JMESPath は、Python での簡単かつ強力な JSON 解析に最適なバランスを提供します。

JMESPath の主な利点は次のとおりです。

  • 簡潔なクエリ構文
  • 大規模な JSON ドキュメントの高速パフォーマンス
  • 学びやすい表現
  • 優れたドキュメントとコミュニティサポート
  • 洗練されたオブジェクト投影
  • JSON専用に構築

Web スクレイピングされた JSON を素早く解析するには、JMESPath が私の頼りになる選択肢です。

その他の JMESPath リソース

JMESPath をマスターするためのその他の優れたリソースをいくつか紹介します。

特に、 JMESPath ターミナル ここでは、サンプル JSON データに対して式をすぐに試すことができます。

すべての JSON を解析してみましょう!

Python で JMESPath を使用して JSON を解析するための簡単な紹介にご参加いただきありがとうございます。お役に立てば幸いです!

ここで取り上げた内容を簡単に要約します。

  • JMESPathとは何ですか? – JSON データのフィルタリング、フラット化、および変換のためのクエリ言語。
  • なぜそれが重要 – JSON は主要な Web データ形式になりました。
  • インストールする方法pip install jmespath
  • クエリの基本 – ドット表記、配列のインデックス付け、フィルターなど。
  • 平坦化・突出 – 複雑なネストされた JSON を再形成します。
  • 選別・スライス – JSON 配列のラングリング。
  • Webスクレイピングの例 – JMESPath を使用して realtor.com からデータを抽出します。

JSON の台頭により、JMESPath のようなツールを使用すると、スクレイピングされた Web サイトや API から有用なデータを抽出することが大幅に簡素化されます。

他にご質問がございましたら、お知らせください。私はいつもウェブスクレイパー仲間を喜んで助けます。

さあ、JMESPath を使用して、Web 上の貴重な JSON をすべて収集しましょう。

参加する

あなたのメールアドレスは公開されません。 必須フィールドは、マークされています *