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 檔案中。內容如下圖所示

第十三章 Python: xml轉json

下面針對這個結果檔案先做個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檔案

第十三章 Python: xml轉json

4,接下來的工作

升級gsExtractor提取器類,加入新的方法,支援把提取結果從xml轉換為json格式

轉換成的json結構必須符合GooSeeker要求的語義描述結構,為直接存入MongoDB做準備

5,相關文件

1, Python即時網路爬蟲專案: 內容提取器的定義

2,Python爬蟲實戰(2):爬取京東商品列表

6,集搜客GooSeeker開原始碼下載源

1, GooSeeker開源Python網路爬蟲GitHub源

7,文件修改歷史

2016-06-14:V1。0,首次釋出

上一章 Python3下執行測試Scrapy <<<<<首頁>>>>> 下一章 下載內容提取器的API