データパス - Pythonのクローラー - JSONモジュールJsonPath

まず、JSONは何ですか?

それは単にJSONはJavaScriptのオブジェクトと配列であるので、2つの構造は、オブジェクトと二つの構造のアレイであり、二つの構造は、複雑な構造の多様で表すことができます。

  • オブジェクト:オブジェクトのJSは、として表現{ }囲まコンテンツ、データ構造  { key:value, key:value, ... }のキーの設定、オブジェクト指向言語、それは容易に理解されるようにオブジェクトのキー属性、対応するプロパティ値の値で、値のオブジェクトのプロパティ値を取得する.KEY方法、属性値の種類は数、文字することができ、文字列、配列、オブジェクトのこれらのタイプ。
  • アレイ:アレイは、JSの括弧にある[ ]囲まれたコンテンツは、データ構造  ["Python", "javascript", "C++", ...]のすべての言語で、モード値、取得インデックス、値型フィールドの使用は、数字、文字列、アレイ、いくつかのオブジェクトとすることができます。

二、JSONの基本的な機能

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

1.json.loads()

書式文字列を変換することは、以下のように変換の種類を制御するために、PythonのPythonのJSONからJSONオブジェクトに復号されます。

Json_loads.py 

インポートJSONの

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

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

json.loads(strlist)
#1 [1。 、2 ,. 3 ,. 4] 

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

2.json.dumps()

文字列に実装されたPython JSON型、STRターゲットオブジェクトを返すJSONとしてエンコードPython文字列を変換することです

次のように制御の元の型PythonのJSON型からの変換があります

 

Json_dumps.py 

インポート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でエンコードされたchardet.detect()返回字典、其中自信是检测精确度

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

chardet.detect(json.dumps(dictStr)) 
{ '信頼':1.0、 'エンコーディング': 'ASCII'} 

印刷 json.dumps(dictStr、ensure_ascii = 偽) 
 { "都市": "北京"、「名前「: "大刘"} 

chardet.detect(json.dumps(dictStr、ensure_ascii = 偽))
{ '信頼' 150、 'エンコーディング': 'UTF-8'}

3.json.dump()

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

#1 json_dump.pyの

インポートJSON 

listStr = [{ " "" 北京" }、{ " 名前"" 大刘" }] 
json.dump(listStr、オープン(" listStr.json "" W ")、ensure_ascii = False)が

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

4.json.load()

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

#1 json_load.pyの

インポートJSON 

strList = json.load(オープン(" listStr.json " ))
 印刷strListの

#1 [{u'city 'U'の\ u5317の\のu4eac '}、{u'name' U '\ u5927 \ u5218 '}] 

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

三、JsonPath

1.JsonPathルール

XPathの JSONPath 説明
/ $ ルート
. @ 現在のノード
/ .若しくは[] 子ノードを取ります
.. N / A 親ノードを取り、Jsonpathはサポートしていません
// .. つまり、すべての適格条件を選択し、場所に関係なく、あります
* * 一致するすべての要素ノード
@ N / A JSONのキーと値がありません、再帰的な構造であるため、プロパティへのアクセスによると、JSONは、サポートされていません。
[] [] フラグイテレータ(単純反復操作は、配列インデックスとして、その中に行うことができ、コンテンツの選択された値、等に応じて)
| [,] サポートイテレータは、複数の選択を行います。
[] ?() フィルタリングをサポートしています。
N / A () 式の評価のためのサポート
() N / A グループ化、JsonPathはサポートされていません

2.例

# jsonpath_lagou.py

import urllib2
import jsonpath
import json
import chardet

url = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json'
request =urllib2.Request(url)
response = urllib2.urlopen(request)
html = response.read()

# 把json格式字符串转换成python对象
jsonobj = json.loads(html)

# 从根节点开始,匹配name节点
citylist = jsonpath.jsonpath(jsonobj,'$..name')

print citylist
print type(citylist)
fp = open('city.json','w')

content = json.dumps(citylist, ensure_ascii=False)
print content

fp.write(content.encode('utf-8'))
fp.close()

注意事项

##字符串编码转换

这是中国程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的。
其实编码问题很好搞定,只要记住一点:

####任何平台的任何编码 都能和 Unicode 互相转换

UTF-8 与 GBK 互相转换,那就先把UTF-8转换成Unicode,再从Unicode转换成GBK,反之同理。

# 这是一个 UTF-8 编码的字符串
utf8Str = "你好地球"

# 1. 将 UTF-8 编码的字符串 转换成 Unicode 编码
unicodeStr = utf8Str.decode("UTF-8")

# 2. 再将 Unicode 编码格式字符串 转换成 GBK 编码
gbkData = unicodeStr.encode("GBK")

# 3. 再将 GBK 编码格式字符串 转化成 Unicode
unicodeStr = gbkData.decode("gbk")

# 4. 再将 Unicode 编码格式字符串转换成 UTF-8
utf8Str = unicodeStr.encode("UTF-8")

 

おすすめ

転載: www.cnblogs.com/Iceredtea/p/11294362.html