注释很清晰。
1.读取txt的内容,建立xml元素结点
# coding=utf-8 2017/4/7
__author__ = 'Asktao'
import os
import io
from xml.dom.minidom import Document
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class readFileToXML(object):
def __init__(self, filepath):
self.JSON_dict = {"hosts": {}}
#最开始创建好root节点
self.doc = Document() # 创建DOM文档对象
self.root = self.doc.createElement('root') # 创建根元素
self.doc.appendChild(self.root)
dirs0 = os.listdir(filepath)#[sports,news]
for dir0 in dirs0:
# 最外层目录【体育 佛学】遍历 创建parentTitle
# 创建root下第一节点parentTitle
self.parentT = self.doc.createElement('parentTitle')
self.root.appendChild(self.parentT)
par = os.path.join(filepath, dir0)
dirs1 = os.listdir(par)#[cna,nba]
for f0 in dirs1:
# 上级目录下类别目录下【NBA CBA】遍历 subTitle
# 创建parentTitle下节点subTitle
self.subT = self.doc.createElement('subTitle')
self.parentT.appendChild(self.subT)
child0 = os.path.join(par,f0)
dirs2 = os.listdir(child0)
for f1 in dirs2:
# 上级目录下每个文件即每个新闻【具体新闻1 新闻2】遍历 subTitle
# 创建parentTitle下节点subTitle
child1 = os.path.join(child0,f1)
if os.path.isfile(child1):
self.filepath = child1 # 新闻完整路径
self._path = os.path.split(child1)[0] # 文件的路径
self.subTitle = os.path.split(self._path)[-1]#子类别 【CBA】
self.prefix = os.path.split(self._path)[0]#CBA所属的文件路径
self.parentTitle = os.path.split(self.prefix)[-1]#父类别 【体育】
self._filename = os.path.split(child1)[1] # 文件的名称
#self.DATA_JSON = readFileToXML.readFileToDict(self) # JSON格式数据
#self.DATA_XML = readFileToXML.json2XML(self) # XML格式数据
#生成JSON格式数据,生成XML格式数据
# 每条新闻存放到一个大节点里
self.DATA_XML = readFileToXML.readFileToDictToXML(self)
# 每个类别存放到一个大节点里【CBA NBA】
self.subT.setAttribute("title", self.subTitle)
# 每个类别存放到一个大节点里【体育 佛学】
self.parentT.setAttribute("title", self.parentTitle)
def readFileToDictToXML(self):
'''
解析原始文件,提取信息存为字典格式(JSON)
'''
# 用于这里原始文件的数据,编排成JSON格式。
with io.open(self.filepath, "r", encoding = 'utf8') as file:
#读取新闻内容
lines = file.readlines()
# 读取新闻大类别 过滤换行
self.parentTitle = lines[1].strip('\n')
# 读取新闻子类别 过滤换行
self.subTitle = lines[3].strip('\n')
# 读取新闻url 过滤换行
self.sonUrl = lines[4].strip('\n')
# 读取新闻标题 过滤换行
self.head = lines[5].strip('\n')
# 读取新闻时间 过滤换行
self.time = lines[6].strip('\n')
# 读取新闻内容 过滤换行
self.content = lines[7].strip('\n')
# 判断JSON_dict中索引是否存在,如不在则创建
if not self.parentTitle in self.JSON_dict["hosts"]:
# 用parentTitle做索引(用parentTitle做一级目录)
self.JSON_dict["hosts"][self.parentTitle] = {}
# 判断JSON_dict中索引是否存在,如不在则创建
if not self.subTitle in self.JSON_dict["hosts"][self.parentTitle]:
# 用subTitle做索引(用subTitle做二级目录)
self.JSON_dict["hosts"][self.parentTitle][self.subTitle] = {}
# 创建subTitle下节点sonT,存放url head time content
self.sonT = self.doc.createElement('son')
self.subT.appendChild(self.sonT)
# 创建sonT下节点url
self.JSON_dict["hosts"][self.parentTitle][self.subTitle]["sonUrl"] = self.sonUrl # 添加url到JSON_dict
self.url = self.doc.createElement('url')
self.url_data = self.doc.createTextNode(
self.JSON_dict["hosts"][self.parentTitle][self.subTitle]["sonUrl"].encode('utf-8'))
self.url.appendChild(self.url_data)
self.sonT.appendChild(self.url)
#self.sonT.setAttribute("title",self.JSON_dict["hosts"][self.parentTitle][self.subTitle]["sonUrl"].encode('utf-8'))
# 创建sonT下节点head
self.JSON_dict["hosts"][self.parentTitle][self.subTitle]["head"] = self.head # 添加机器名到JSON_dict
self.head = self.doc.createElement('head') # 创建Platform第一节点Module
self.head_data = self.doc.createTextNode(
self.JSON_dict["hosts"][self.parentTitle][self.subTitle]["head"].encode('utf-8'))
self.head.appendChild(self.head_data)
self.sonT.appendChild(self.head)
# 创建sonT下节点time
self.JSON_dict["hosts"][self.parentTitle][self.subTitle]["time"] = self.time # 添加time到JSON_dict
self.time = self.doc.createElement('time')
self.time_data = self.doc.createTextNode(
self.JSON_dict["hosts"][self.parentTitle][self.subTitle]["time"].encode('utf-8'))
self.time.appendChild(self.time_data)
self.sonT.appendChild(self.time)
# 创建sonT下节点content
self.JSON_dict["hosts"][self.parentTitle][self.subTitle]["content"] = self.content
self.content = self.doc.createElement('content')
self.content_data = self.doc.createTextNode(self.JSON_dict["hosts"][self.parentTitle][self.subTitle]["content"])
self.content.appendChild(self.content_data)
self.sonT.appendChild(self.content)
#return self.JSON_dict
return self.doc.toprettyxml(indent='')
def json2XML(self):
'''
生成XML文档。
for self.parentTitle in self.DATA_JSON["hosts"]:
for self.subTitle in self.DATA_JSON["hosts"][self.parentTitle]:
#sonT = self.doc.createElement('son')
self.sonT.setAttribute("title", self.DATA_JSON["hosts"][self.parentTitle][self.subTitle]["head"].encode('utf-8'))
self.sonUrl = self.doc.createElement('sonUrl') # 创建Platform第一节点Module
self.sonUrl_data = self.doc.createTextNode(self.DATA_JSON["hosts"][self.parentTitle][self.subTitle]["sonUrl"].encode('utf-8'))
self.sonUrl.appendChild(self.sonUrl_data)
self.sonT.appendChild(self.sonUrl)
return self.doc.toprettyxml(indent='')
'''
def makeXML(self):
f = io.open('scrawlToXML' + '.xml', 'w', encoding="UTF-8")
f.write(self.DATA_XML)
f.close()
2.调用生成xml文件:
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
import readFileToXML as RFTX
# 实例化
TEST = RFTX.readFileToXML("/Users/Zd/Desktop/newsSpider/data/")
# 在当前目录下生成XML文件
TEST.makeXML()
# 打印JSON格式数据
#print("JSON格式:%s" % TEST.DATA_JSON)
# 打印XML格式数据
print("XML格式:\n %s " % TEST.DATA_XML)
print(TEST._path) # 路径
print(TEST._filename) # 文件名
3.参考:
https://blog.csdn.net/sxf_123456/article/details/77145855
网友评论