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檔案
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