Pythonの爬虫類(XIII)_JSONモジュールJsonPath

JSONとJsonPATH内のデータを抽出します

JSON(JavaScript Object Notation)は、人々が読み書きが非常に簡単である、軽量のデータ交換フォーマットです。しかし、また、分析・生成機を促進します。シーンデータ交換、などの前景と背景などのサイト間のデータ交換に適しています。

JSONとXMLの比較は、比較可能なように記述することができます。

Python2.7は直接、JSONモジュールで提供されますimport json使用する準備が整いました。
公式ブログ:のhttp://docs.python.org/library/json.html

JSONの構文解析オンラインウェブサイト:http://www.json.cn/#

JSON

これは単に両オブジェクトおよびデータ構造は、2つの構造、二つの構造が複雑な構造の様々な表現することができるされ、JavaScriptのオブジェクトと配列JSONです。

  1. オブジェクト:{:値、キー:値、...キー}キー構造の、オブジェクト指向言語では、オブジェクトのキープロパティオブジェクトは、JSデータ構造、{}囲まれたコンテンツとして表されそれは容易にプロパティ値を取得.KEYオブジェクト値の方法と理解されるように、対応する特性値の値は、属性値の種類は、オブジェクトの数、文字列、配列、これらの種類であってもよいです。
  2. アレイ:アレイは角括弧[] JS囲まれるコンテンツ、データ構造[「パイソン」、「ジャバスクリプト」、「C ++」、..]、およびすべての言語のモード値、指標取得の使用、フィールドタイプ値は、数値、文字列、アレイ、複数のオブジェクトであってもよいです。

輸入JSON

JSONモジュールは、4つの機能を提供する:dumps、、 、dump および文字列データ型変換キーためのPython。loadsload

1、json.loads()

JSONは次のようにJSONのPythonの型変換制御にPythonオブジェクトから復号フォーマット文字列に変換しました:

Json_loads.py 

インポートJSON 


strlist = ' [1、2 ,. 3 ,. 4] ' 

strDict = ' { "都市": "北京"、 "名": "ビッグキャット"} ' 

json.loads(strlist)
のための STR strlist:
     印刷(STR)
 #1 [1、2 ,. 3 ,. 4] 

json.loads(strDict)  JSONデータを自動的にUnicodeとして格納されている
。#'U'の\ u5317の\のu4eac 'u'name':U {u'city '\ u5927ののの\ u732b'}

2、json.dumps()

文字列に実装されたPython JSON型は、STRオブジェクトを返します。元の型PythonのJSON形式の文字列として符号化PythonオブジェクトJSON、以下の変換テーブルを変換します。

Json_dumps.py 

- * -コーディング:UTF-8 - * - 

インポートJSON
 インポートchardet 

listStr = [1,2 ,. 3 ,. 4。] 
tupleStr =(1,2 ,. 3 ,. 4 
dictStr   = { " "" 北京" " "" 大きな猫} 

プリント(型(json.dumps(listStr)))
'[1、2 ,. 3 ,. 4]' 

プリント(型(json.dumps(tupleStr)))
' [1、2、3、4] ' 

#1 注json.dumps()デフォルトのシリアル化のASCIIコード、そのパラメータensure_asciiを追加= Falseを、ASCIIエンコードを無効にすることを、UTF-8でエンコードされた
#1 chardet.detect()自信が検出精度で辞書を返します。

印刷(json.dumps(dictStr))
'{ "市": "\\ \\ u5317 u4eac"、 "名": "\\ \\ u5218 u5927"}' 

印刷(chardet.detect(json.dumps(dictStr )))

印刷(json.dumps(dictStr、ensure_ascii = 偽))

を印刷(chardet.detect(json.dumps(dictStr、偽= ensure_ascii)))

 

chardet符号化は、非常に良好な識別モジュールであるPIPによってインストールすることができます

3. json.dump()

ファイルは内蔵のPythonの型オブジェクトに書き込まれた後、JSONにシリアライズされています

#1 json_dump.pyの

インポートJSON 

listStr = [{ " "" 北京" }、{ " 名前"" 大刘" }] 

json.dump(listStr、オープン(" listStr.json "" W ")、ensure_ascii = False)が

dictStr = { " 都市"" 北京"" "" 大刘"} 
json.dump(dictStr.open(" dictStr.json "" W ")、偽= ensure_ascii)

 

4.json.load()

JSONファイルの読み出しは、文字列の要素型のpythonの形式に変換され、

- * -コーディング:UTF-8 - * - 


インポートJSON 

strList = json.load(オープン(" listStr.json " ))
 印刷strList
 #1 [{u'city ':U' \ u5317 \ u4eac '}、{U '名前':uは'u5927用の\ u5218を\'}] 

strDict = json.load(オープン(" dictStr.json " ))
 印刷strDictの
 {u'city ':U' \ u5317 \ u4eac 'u'name': U '\ u5927ののの\ u5218'}

 

JsonPath

JsonPathは、情報抽出ライブラリである資本保全を達成するために、さまざまな理由を提供JSONドキュメントツールから特定の情報を抽出することである:JavaScriptの/ Pythonの/ PHPとJava

JSON、XMLのための同等のXPATHについてはJsonPath

ダウンロードします。https://pypi.python.org/pypi/jsonpathの
インストールは:jsonpathをダウンロードするダウンロードURLリンクをクリックした後実行し、解凍Pythonはsetup.py installを
します。http://goessner.net/articles/JsonPath公式文書を

XPath構文とJsonPathコントラスト:

JSON明確な構造、高い可読性、低複雑さは、非常に簡単に対応するテーブルの使用XPathを一致させます。

Xpath JSONPath 説明
/ $ ノードと
@ 現在のノード
/ または [] 子ノードを取ります
。.. N / A つまり、すべての適格条件を選択し、場所に関係なく、あります
* * 一致するすべての要素ノード
[] [] フラグイテレータを(単純な反復動作は、コンテンツ選択された値、等によれば、そのような配列のインデックスとして、内側に行うことができます)
&#124 [、] サポートイテレータは、複数の選択肢を行います
[] ?() サポートフィルタリング
N / A () 式の評価のためのサポート
() N / A グループ化、JsonPathはサポートされていません

例:

私たちの街のJSONファイルhttp://www.lagou.com/lbs/getAllCitySearchLabels.json、例えば、すべての都市へのアクセスをフック網を引きます。

- * -コーディング:UTF-8 - * - 

インポートurllib2の
 インポートJSON
 インポートjsonpath
 インポートchardetの


URL = " http://www.lagou.com/lbs/getAllCitySearchLabels.json " 
要求 = はurllib2.Request(URL)

レスポンス   = urllib2の.urlopen(要求)

HTML = response.read() 

、PythonのJSONオブジェクトにフォーマット文字列を変換 
jsonobj = json.loads(HTML) 

ルートから出発し、一致ノード名 
CityList = jsonpath.jsonpath(jsonobj、' $を。 .nameの" 

プリントCityListの
 印刷(タイプ(citylist))

FP =オープン(' city.json '' W ' 


含量 = json.dumps(citylist、ensure_ascii = False)が
 印刷コンテンツ
fp.write(content.encode(' UTF-8 ' ))

FP 。閉じる()

 

注意事項:

時間json.loadsエラーコードでJSON文字を留意すべきで復号される場合json.loads()は、復号化された書式文字列JSON Pythonオブジェクトに変換されます。

入ってくる文字列のエンコーディングはUTF-8、文字符号化パラメータについて、次に必要ではない場合:encoding

dataDict = json.loads(jsonStrGBK);
  • dataJsonStr JSON文字列は、コード自体は、非UTF-8が、GBKワードに対応するエラーで、次いで上記のコードの結果であると仮定されます。
dataDict = json.loads(jsonStrGBK, encoding="GBK")
  • 適切なコーディングdataJsonStrは、エンコーディングによって指定されたが、他の文字エンコーディングが含まれている場合、)dataJsonStrがUnicodeに行き、そしてどのように再エンコード形式指定されたコールjson.loads(変換する必要があります
dataJsonStrUni = data.JsonStr.decode(" 2312 " 
dataDict = json.loads(dataJsontrUni、エンコーディング= " 2312 "

文字列のトランスコーディング

これは、プログラマの場所を強制するのが最も難しいです、ほぼすべての漢字には、などが原因を文字化け。
実際には、コーディングの問題がうまく取得するには、ただ一つのことを覚えておいてください。

任意のエンコーディング任意のプラットフォーム、およびUnicodeは交換することができます。

UTF-8とGBK相互変換は、最初のUnicode UTF-8に変換され、次いでGBK、共感及びその逆にUnicodeから変換されます。

これは、UTF-8でエンコードされた文字列である 
utf8Str = " こんにちは地球" 

コードユニコードにUTF-8でエンコードされた文字列を変換する1 
unicodeStr = utf8Str.decode(" UTF-8 " 

そして2 GBKをコード変換するUnicodeエンコード形式文字列 
gbkData = unicodeStr.encode(" GBK " 

1 GBK符号化フォーマットストリングを、次いで、Unicodeに変換 
unicodeStr = gbkData.decode(" GBK " 

Unicodeエンコーディング形式次に2. UTFに8列 
utf8Str = unicodeStr.encode(" UTF-8 "

decode他の役割は、Unicodeエンコーディングにエンコードされた文字列を変換することである
encode役割Unicodeは、他にエンコードされた文字列を符号化された変換することである
言葉:UTF-8Unicode文字セット符号化メモリの符号化形式であります

参考リンク:https://www.cnblogs.com/miqi1992/category/1105419.html

おすすめ

転載: www.cnblogs.com/moying-wq/p/11570013.html