图片 8

数据解析

数据解析流程

1.指定url2.发起请求3.获取页面数据4.解析数据5.持久化存储

   
JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大。本文系统的分析两种解析方式的区别,为更好地处理数据作准备。由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和XML解析均是在安卓环境下进行测试。
    首先要明确一点,数据解析是为了获取数据的每一个值,对于JSON数据而言类似于键值对的形式,对于XML而言是标签和值的形式。简单来说就是要在一个JSON数据或XML数据中利用键或标签找到对应值。
   
其次要了解一下两种数据的数据结构。JSON数据分为三种:对象类型、数组类型、混合类型。对象类型JSON数据用大括号包裹,属性和值相对应。数组类型JSON数据可以看成多个对象类型JSON数据组合在一起,用中括号包裹。混合类型JSON数据中既有对象类型又有数组类型,大括号表示的是对象,中括号表示的是数组。XML数据以标签的形式进行存储,通过标签名获取值。所以无论是JSON解析还是XML解析,都可以先定义一个双列集合出来,用于存放数据。

三种数据解析方式 :正则,xpath,bs4

      JSON数据类型:

正则

import re# 提取出pythonkey = 'javapython-php're.findall('python',key)re.findall('python',key)[0]

# 提取helloworldkey = '<html><h1>hello world</h1></html>'re.findall('<h1></h1>',key)[0]

# 提取 170string = '我喜欢身高170的女生're.findall('\d+',string)[0]

# 提取出http:// 和https://key = 'http://www.baidu.com and https://bobo.com'#方法一   ? 出现0次或一次re.findall('https?://',key)# 方法二re.findall('https{0,1}://',key)

# 提取出hit.key = 'bobo@hit.edu.com're.findall('h.*\.',key) #['hit.edu.'] 贪婪模式下,尽可能多的匹配re.findall('h.*?\.',key) # 加一个问号,切换到非贪婪模式

# 匹配sas或者saaaskey = 'saas and sas saaas're.findall('sa{1,2}s',key)

# 匹配出i开头的行  re.S-基于单行匹配  re.M-基于多行匹配key ='''fall in love with you i love you very muchi love youi love you '''re.findall('^i.*',key,re.M)

# 匹配所有的行key = '''<div>静夜思窗前明月光疑是地上霜举头望明月低头思故乡</div>'''re.findall('<div>.*</div>',key,re.S)

                                
图片 1
   

练习

 1 import requests 2 import re 3 import os 4 # 指定url 5 url = 'https://www.qiushibaike.com/pic/' 6 # 自定义请求头信息 7 headers={ 8     'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' 9 10 }11 # 发起请求12 response=requests.get(url=url,headers=headers)13 # 获取页面数据14 page_text = response.text15 # 数据解析16 img_list=re.findall('<div >.*?<img src="".*?>.*?</div>',page_text,re.S)17 18 #创建一个存储图片的文件夹19 if not os.path.exists('./imgs'):20     os.makedirs('./imgs')21     22 for url in img_list:23     img_url='https:'+url24     img_data=requests.get(url=img_url,headers=headers).content25     imgName = url.split('/')[-1]26     imgPath = 'imgs/'+imgName27     with open(imgPath,'wb')as fp:28         fp.write29         print(imgName+"写入成功")

    在安卓环境下解析JSON数据有两种方式,一种是自定义方法根据数据结构分层解析,另一种是用开源框架。自定义方法进行解析时,又可以分为对象解析、数组解析、综合解析。对象解析较为简单,先创建JSON对象,用对象的GetXxx()的方法获取对应的值,然后存储在集合中,即获取到JSON数据。数组解析先通过JsonArray对象获取JSON对象,然后参照对象解析的方法。综合解析则是在上述两种解析基础上完成的。根据JSON数据的结构,按照顺序一次获取JSON对象和JsonArray对象知道获取到所需数据。用开源框架进行解析基本原理类似,只不过需要提前进行导包,并创建一个方法类来调用包里的内容。
    读取对象类型的JSON数据:

                         
图片 2

 

           读取数组类型的JSON数据:

                                            
图片 3

         读取综合类型的JSON数据:

                                      
图片 4

        用开源框架读取JSON数据的目录结构:

                                            图片 5

 

   
XML解析是边读边解析,方法较为固定,从上到下依次解析。首先创建XmlPullParser解析器,利用解析器设置要解析的流对象。然后在一个循环中判断标签类型,如果遇到文件结束标(END_DOCUMENT)签跳出循环,否则进入循环。在循环中在有两种情况,若是开始标签(START_TAG),进入标签内部,根据标签名判断要获取的数据,当标签名和要得到的数据名相同时,用nextText()获取数据。若是结束标签(END_TAG)将获取的数据存入集合。最后一点,不要忘记把标签移向下一个位置,即:type
= parser.next()。

         XML解析的方法代码:

                               
图片 6

     
为更好的演示效果,本文最终做出的案例是用安卓设备从Tomcat服务器上获取到JSON数据和XML数据,然后进行解析,将解析后的结果展示在安卓设备上。

      JSON原始数据:

                      

{
    "resultcode": "200",
    "reason": "查询成功!",
    "result": {
        "sk": {     
            "temp": "21",     
            "wind_direction": "西风",     
            "wind_strength": "2级",         
            "humidity": "4%",     
            "time": "14:25"     
        },
        "today": {
            "city": "天津",
            "date_y": "2014年03月21日",
            "week": "星期五",
            "temperature": "8℃~20℃",     
            "weather": "晴转霾",     
            "weather_id": {     
                "fa": "00",     
                "fb": "53"     
            },
            "wind": "西南风微风",
            "dressing_index": "较冷", 
            "dressing_advice": "建议着大衣、呢外套加毛衣、卫衣等服装。",     
            "uv_index": "中等",     
            "comfort_index": "", 
            "wash_index": "较适宜",     
            "travel_index": "适宜",     
            "exercise_index": "较适宜",     
            "drying_index": "" 
        },
        "future": [     
            {
                "temperature": "28℃~36℃",
                "weather": "晴转多云",
                "weather_id": {
                    "fa": "00",
                    "fb": "01"
                },
                "wind": "南风3-4级",
                "week": "星期一",
                "date": "20140804"
            },
            {
                "temperature": "28℃~36℃",
                "weather": "晴转多云",
                "weather_id": {
                    "fa": "00",
                    "fb": "01"
                },
                "wind": "东南风3-4级",
                "week": "星期二",
                "date": "20140805"
            },
            {
                "temperature": "27℃~35℃",
                "weather": "晴转多云",
                "weather_id": {
                    "fa": "00",
                    "fb": "01"
                },
                "wind": "东南风3-4级",
                "week": "星期三",
                "date": "20140806"
            },
            {
                "temperature": "27℃~34℃",
                "weather": "多云",
                "weather_id": {
                    "fa": "01",
                    "fb": "01"
                },
                "wind": "东南风3-4级",
                "week": "星期四",
                "date": "20140807"
            },
            {
                "temperature": "27℃~33℃",
                "weather": "多云",
                "weather_id": {
                    "fa": "01",
                    "fb": "01"
                },
                "wind": "东北风4-5级",
                "week": "星期五",
                "date": "20140808"
            },
            {
                "temperature": "26℃~33℃",
                "weather": "多云",
                "weather_id": {
                    "fa": "01",
                    "fb": "01"
                },
                "wind": "北风4-5级",
                "week": "星期六",
                "date": "20140809"
            },
            {
                "temperature": "26℃~33℃",
                "weather": "多云",
                "weather_id": {
                    "fa": "01",
                    "fb": "01"
                },
                "wind": "北风4-5级",
                "week": "星期日",
                "date": "20140810"
            }
        ]
    },
    "error_code": 0
}

 

              解析其中的“future”数据,结果如下:

                                 
图片 7

      XML原始数据:

      

<?xml version="1.0" encoding="UTF-8" ?> 
<channel>
<item>
  <title>军报评徐才厚</title> 
  <description>人死账不消 反腐步不停,支持,威武,顶,有希望了。
  </description>
  <image>http://192.168.1.103:8080/img/a.jpg</image>
  <type>1</type>
  <comment>163</comment>
  </item>


 <item>
  <title>女司机翻车后直奔麻将室</title> 
  <description>女司机翻车后直奔麻将室,称大难不死手气必红
  </description>
  <image>http://192.168.1.103:8080/img/b.jpg</image>
  <type>2</type>
  </item>


  <item>
  <title>小伙当“男公关”以为陪美女</title> 
  <description>来源:中国青年网,小伙当“男公关”以为陪美女,上工后被大妈吓怕  </description>
  <image>http://192.168.1.103:8080/img/c.jpg</image>
  <type>3</type>
  </item>


  <item>
  <title>男子看上女孩背影欲强奸</title> 
  <description> 来源:新京报, 看到正脸后放弃仍被捕
  </description>
  <image>http://192.168.1.103:8080/img/d.jpg</image>
  <type>1</type>
  <comment>763</comment>
  </item>
</channel>

        解析后的成果展示:

                      图片 8

               至此,基本完成JSON解析和XML解析。

                                                                                                                                                                                 
2016-10-11   14:20:07