python數據存儲--JSON


HTML正文存儲為兩種格式:JSON和CSV。

存儲為JSON:

  • 首先利用Requests訪問http://seputu.com獲取HTML文檔:
#!coding:utf-8
import requests
import json
from bs4 import BeautifulSoup
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-agent': user_agent}
r = requests.get('http://seputu.com',headers)
r.encoding="utf-8"#指定編碼方式
print r.text
  • 取每章節<div class="mulu">中的h2標簽和<div class="box">中的<a>中
soup = BeautifulSoup(r.text,'html.parser',from_encoding='utf-8')
for mulu in soup.find_all(class_="mulu"):
    h2 = mulu.find('h2')
    if h2!=None:
        h2_title = h2.string#獲取標題
        for a in mulu.find(class_='box').find_all('a'):#獲取所有的a標簽中url和章節內容
            href = a.get('href')
            box_title = a.get('title')
            print href,box_title

接下來將數據存儲為JSON。

  • python對JSON文件的操作分為編碼和解碼,通過JSON模塊實現,編碼是指python對象轉換成JSON對象過程,使用的函數是dumps和dump。兩個函數區別在於dump把python對象轉換成JSON對象,並將JSON對象通過fp文件流入文件中,而dumps則生成一個字符串:
  dumps (obj,skipkeys=False, ensure. ascii=True, check_ circular=True,
  allow_ nan=True, c1s=None, indent =None, separators=None,encoding= 'utf-8',  de fault=None, sort_ keys=False, **kw)
  dump(obj, fp, skipkeys=False, ensure_ ascii=True, check_ circular=True ,
  allow_ nan=True, cls=None, indent=None, separators=None,encoding='utf-8', default=None, sort_ keys=False, **kw) :
  常用參數分析:
  口Skipkeys:默認值是False。如果dict的keys內的數據不是python的基本類型( str、
  unicode、int、 long、 float、 bool、 None), 設置為False時,就會報TypeError錯誤。此時設置成True,則會跳過這類key。

  口ensure ascii:默認值True。如果dict內含有非ASCII的字符,則會以類似“\uXXXX”
  的格式顯示數據,設置成False后,就能正常顯示。

  口indent:應該是一一個非負的整型, 如果是0,或者為空,則一行顯示數據,否則會換行
  且按照indent的數量顯示前面的空白,將JSON內容進行格式化顯示。

  口separators:分隔符,實際上是( tem separator, dict separator) 的一個元組, 默認的就是
  .),這表示dictionary內keys之間用“,”隔開,而key和value之間用“:”隔開。

  口encoding:默認是UTF-8。設置JSON數據的編碼方式,在處理中文時一一定要注意。

  sort. keys:將數據根據keys的值進行排序。

  • 總的代碼
#!coding:utf-8
import requests
import json
from bs4 import BeautifulSoup
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-agent': user_agent}
r = requests.get('http://seputu.com',headers)
r.encoding="utf-8"
print r.text
content=[]
soup = BeautifulSoup(r.text,'html.parser',from_encoding='utf-8')
for mulu in soup.find_all(class_="mulu"):
    h2 = mulu.find('h2')
    if h2!=None:
        h2_title = h2.string#獲取標題
        list=[]
        for a in mulu.find(class_='box').find_all('a'):#獲取所有的a標簽中url和章節內容
            href = a.get('href')
            box_title = a.get('title')
            print href,box_title
            list.append({'href':href,'box_title':box_title})
        content.append({'title':h2_title,'content':list})
with open('guguobao.json','wb') as fp:
    json.dump(content,fp=fp,indent=4)

解碼過程是把json對象轉換成python對象的一個過程,常見函數是load和loads函數,區別和dump與dumps是一樣的,函數原型:

loads (s,encoding=None, cls=None,object_ hook=None, parse_ float =None ,parse_ int =None,parse_ constant=None, object_ pairs_ hook=None, * * kw)
load(fp,encoding=None, cls=None, object_ hook=None, parse_ float =None,parse_ int=None, parse_ constant=None, object_ pairs_ hook=None, **kw)

常用參數分析:
encoding:指定編碼格式。
parse float: 如果指定,將把每一個JSON字符串按照float 解碼調用。默認情況下,
這相當於float(num str)。
口
parse int: 如果指定,將把每一個JSON字符串按照int解碼調用。默認情況下,這相
當於int(num str)。
示例如下:

new_ str=json.loads (json_ str)
print new_ str
with open('guguobao.txt', 'r') as fp:
    print json.load(fp)


輸出結果:
[{u username': u'\u4e03\u591c', u'age': 24},[2,3], 11]
[{u username': u'\u4e03\u591c', u'age': 24},[2,3],11]
    

通過上面的例子可以看到,Python的一些基本類型通過編碼之后,tuple類型就轉成了list類型了,再將其轉回為python對象時,list 類刑也並沒有轉回成tuple類型,而且編碼格式也發生了變化,變成了Unicode編碼。具體轉化時,類型變化規則如表5-1和表5-2所示。

表5-1 Python --> JSON

Python JSON
dict Object
list, tuple array
str, unicode string
int, long, float number
True true
Flase false
None null

表5-2 JSON --->Python

JSON Python
object dict
array list
string unicode
number (int) int, long
number (real ) float
true True
false False
nu11 None


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM