Python: xml转json

1,引言
GooSeeker早在9年前就开始了Semantic Web领域的产品化,MS谋数台和DS打数机是其中两个产品。对web内容做结构化转换和语义处理的主要路线是 XML -> RDF -> Ontology Engineering。所以这两款产品的输出信息是XML格式的,实现第一步:结构化转换。单纯作为一个网页采集器来说,输出XML格式也有好处,这是一种标准格式,后续的数据处理可以很容易地接入,任意发挥。
在web集成和网站前端领域,json越来越普遍,在Scrapy架构中,Scrapy dict数据结构本质上就是json,所以,由XML格式转换成JSON格式很有必要。
无论哪种编程语言,XML转Json都有很多现成的程序包,但是,就像前面说的,GooSeeker定义的XML格式主要用来做实体建模,有自己规定的一套语义结构描述标准。所以,不能直接使用现成的转换程序,或者需要在现成的转换程序上做些修改。
本文是一个实验过程,并没有考虑GooSeeker要求的语义结构,只是验证一下XML到Json的转换。
2,实验用的XML文件
我们使用《python爬虫实战(2):爬取京东商品列表》一文的结果文件,python爬虫爬取的结果保存在 京东手机列表_1.xml 文件中。内容如下图所示

下面针对这个结果文件先做个xml转json的测试,为提取器gsExtractor添加输出Json文件的功能做技术准备。
3,测试过程
- 测试使用的模块:xml.parsers.expat, json
- 测试输入: 以python爬虫实战(2):爬取京东商品列表一文的xml结果文件 京东手机列表_1.xml 作为输入
代码如下:
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# xml 转 json
# xml2json.py
# Version 1.0 from xml.parsers.expat import ParserCreate
import json class Xml2Json:
LIST_TAGS = ['COMMANDS'] def __init__(self, data = None):
self._parser = ParserCreate()
self._parser.StartElementHandler = self.start
self._parser.EndElementHandler = self.end
self._parser.CharacterDataHandler = self.data
self.result = None
if data:
self.feed(data)
self.close() def feed(self, data):
self._stack = []
self._data = ''
self._parser.Parse(data, 0) def close(self):
self._parser.Parse("", 1)
del self._parser def start(self, tag, attrs):
assert attrs == {}
assert self._data.strip() == ''
self._stack.append([tag])
self._data = '' def end(self, tag):
last_tag = self._stack.pop()
assert last_tag[0] == tag
if len(last_tag) == 1: #leaf
data = self._data
else:
if tag not in Xml2Json.LIST_TAGS:
# build a dict, repeating pairs get pushed into lists
data = {}
for k, v in last_tag[1:]:
if k not in data:
data[k] = v
else:
el = data[k]
if type(el) is not list:
data[k] = [el, v]
else:
el.append(v)
else: #force into a list
data = [{k:v} for k, v in last_tag[1:]]
if self._stack:
self._stack[-1].append((tag, data))
else:
self.result = {tag:data}
self._data = '' def data(self, data):
self._data = data if __name__ == '__main__':
xml = open("京东手机列表_1.xml", 'r', encoding='UTF-8').read()
result = Xml2Json(xml).result;
outputfile = open("京东手机列表_1.json", 'w', encoding='UTF-8')
outputfile.write(str(result))
outputfile.close()
- 在控制台运行: $ python xml2json.py
- 测试输出:京东手机列表_1.json。运行后在当前文件夹下可以看到新生成的json文件

- 升级gsExtractor提取器类,加入新的方法,支持把提取结果从xml转换为json格式
- 转换成的json结构必须符合GooSeeker要求的语义描述结构,为直接存入MongoDB做准备
5,相关文档
1,Python即时网络爬虫项目: 内容提取器的定义
2,Python爬虫实战(2):爬取京东商品列表
6,集搜客GooSeeker开源代码下载源
1, GooSeeker开源Python网络爬虫GitHub源
Python: xml转json的更多相关文章
- Python 解析构建数据大杂烩 -- csv、xml、json、excel
Python 可以通过各种库去解析我们常见的数据.其中 csv 文件以纯文本形式存储表格数据,以某字符作为分隔值,通常为逗号:xml 可拓展标记语言,很像超文本标记语言 Html ,但主要对文档和数据 ...
- Python解析xml与JSON
xml与json是常用的文件交换格式,常用来表示网页的html则是xml的变种.解析xml和json在web开发中有着重要应用. DOM解析XML 文件对象模型(Document Object Mod ...
- python入门(十):XML和JSON解析
一.python解析XML 1.xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合,注意xml.dom包里面有许多模块,须区分它们间的不同: 2.xml. ...
- python cookbook第三版学习笔记七:python解析csv,json,xml文件
CSV文件读取: Csv文件格式如下:分别有2行三列. 访问代码如下: f=open(r'E:\py_prj\test.csv','rb') f_csv=csv.reader(f) for f in ...
- [Network] HTML、XML和JSON学习汇总
写在前面:楼主也是刚刚接触这方面的知识,之前完全是零基础,后来经朋友推荐了几个不错的博文,看完以后豁然开朗.但是此博文更加偏重于基础知识介绍(其实更深的楼主也还不了解,这方面的大神请绕道),只是分享个 ...
- xml和json的区别
本文转自SanMaoSpace的博客 链接地址如下:http://www.cnblogs.com/SanMaoSpace/p/3139186.html 1.定义介绍 (1).XML定义扩展标记语言 ( ...
- 数据解析(XML和JSON数据结构)
一 解析 二 XML数据结构 三 JSON 数据结构 一 解析 1 定义: 从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照 ...
- 【原】iOS学习之XML与JSON两种数据结构比较和各自底层实现
1.XML与JSON两种数据结构的优缺点 1> XML 优点: 格式统一, 符合标准 容易与其他系统进行远程交互, 数据共享比较方便 缺点: XML文件格式文件庞大, 格式复杂, 传输占 ...
- XML与JSON的对比
XML与JSON的对比 1.各自定义 XML 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类 ...
随机推荐
- 【Ecstore】为自建模块添加自定义主题模板
做好ECSOTRE模块后,需在主题中添加模板,而添加模板页面时只有产品分类页.产品详细页.首页等内置模块的模板类型. 下面介绍如何添加一个自定义的模板类型“buildings”. 一.修改(建议复制到 ...
- php sscanf() 函数使用
定义和用法 sscanf() 函数根据指定的格式解析来自一个字符串的输入. 如果只向该函数传递两个参数,数据将以数组的形式返回.否则,如果传递了额外的参数,那么被解析的数据会存储在这些参数中.如果区分 ...
- pubwin2009服务端 修改系统时间方法
所有操作都是必须的,包括重启. 1.建议操作前全体结账,并交班---不结帐的话, 改完时间会出问题的.2.停止pubwin2009服务端 3.将C:\WINDOWS\system32\driver ...
- openssl 第一篇
自从老罗赞助了openssl以及心脏出血事件的新闻,得以了解了openssl.那么什么是openssl呢?下面摘自官网: The OpenSSL Project is a collaborative ...
- 关于hibernate非主键多对一关联
一直以来,用hibernate做多对一时,关联的都是主键,今天,同事设计的表,关联的却不是主键,这下麻烦了,hibernate的many-to-one默认关联的都是主键,原来,hibernate提供了 ...
- 自定义searchview的编辑框,搜索按钮,删除按钮,光标等
//指定某个私有属性 Field mSearchHintIconField = argClass.getDeclaredField("mSearchHintIcon"); mSea ...
- 2015第10周三jquery ui position
jQuery UI API - .position() 所属类别 方法重载(Method Overrides) | 方法(Methods) | 实用工具(Utilities) 用法 描述:相对另一个元 ...
- 八款强大的jQuery图片滑块动画插件
jQuery是一款相当轻巧的JavaScript框架,目前几乎每一个WEB项目都在使用jQuery,因为jQuery插件实在太丰富,尤其是 一些图片滑块插件和jQuery焦点图插件,更是多如牛毛,很多 ...
- UESTC_Can You Help God Wu CDOJ 582
There is a boy named God Wu in UESTC ACM team. One day he is asked to finish a task. The task is tha ...
- hdu 4501 小明系列故事——买年货_二维背包
题目:你可以有v1元,v2代金券,v3个物品免单,现在有n个商品,商品能用纸币或者代金券购买,当然你可以买v3个商品免费.问怎么最大能买多少价值 题意: 思路二维背包,dp[v1][v2][v3]=M ...