zoukankan      html  css  js  c++  java
  • 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'u4e03u591c', u'age': 24},[2,3], 11]
    [{u username': u'u4e03u591c', 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
  • 相关阅读:
    Tomcat启动报Error listenerStart错误
    The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly
    (转)Android之Adapter用法总结
    利用脚本启动java程序
    Android中的基类—抽取出来公共的方法
    关于 Android 中未公开的类(用@hide隐藏的类)
    Android java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    gen already exists but is not a source folder
    如何注册java程序为windows服务
    Android Socket编程
  • 原文地址:https://www.cnblogs.com/guguobao/p/9512696.html
Copyright © 2011-2022 走看看