用於mongodb中“標準”資料的清洗,資料為網頁原始碼,須從中提取:
標準名稱,標準外文名稱,標準編號,釋出單位,釋出日期,狀態,實施日期,開本頁數,採用關係,中圖分類號,中國標準分類號,國際標準分類號,國別,關鍵詞,摘要,替代標準。
提取後組成字典存入另一集合。
#coding=utf-8 from pymongo import MongoClient from lxml import etree import requests s = [u'標準編號:',u'釋出單位:',u'釋出日期:',u'狀態:',u'實施日期:',u'開本頁數:',u'採用關係:', u'中圖分類號:',u'中國標準分類號:',u'國際標準分類號:',u'國別:',u'關鍵詞:',u'摘要:'] # 獲取資料庫 def get_db(): client = MongoClient('IP', 27017) db = client.wanfang db.authenticate("使用者名稱","密碼") return db # 獲取第num條資料 def get_data(table, num): i = 1 for item in table.find({}, {"content":1,"_id":0}): if i==num: if item.has_key('content') and item['content']: return item['content'] else: i+=1 continue # 列表轉字串 def list_str(list): if len(list)!=0: return list[0] else: return "" # 提取分類號 def code_ls(list): if len(list)!=0: ls = list[0].split() shanchu = [] for i in ls: if ("("in i) or (")"in i) or ("("in i) or(")"in i): shanchu.append(i) for i in shanchu: ls.remove(i) return ls else: return "" # 構造關鍵詞列表 def keywords_ls(list): if len(list)!=0: return list else: return "" # 替代標準 def replace_str(replace): if replace!="": ls = [i.strip().replace("\r\n", "") for i in replace] if len(ls)!=0: return ls[0][5:] else: return "" else: return "" # 提取摘要 def summary_str(list): if len(list)!=0: if list[0][0]!="<": return list[0] else: return "" else: return "" # 調整日期格式 def date_str(list): if len(list)!=0: year = list[0].find(u'年') month = list[0].find(u'月') day = list[0].find(u'日') if month-year==2: list[0] = list[0].replace(u"年",u"年0") if day-month==2: list[0] = list[0].replace(u"月",u"月0") return list[0].replace(u"日","").replace(u"月","-").replace(u"年","-") else: return "" # 調整採標格式 def adopted_ls(string, ls): dc = {} loc = string.find(',') if loc==-1: return ls else: dc["code"] = string[:loc].strip() dc["type"] = string[loc+1:loc+4] ls.append(dc) return adopted_ls(string[loc+4:],ls) # 構造標準入庫字典 def standard_dict(html): dc = {} tree = etree.HTML(html) # 標準名稱 dc["title"] = list_str(tree.xpath("//h1/text()")) # 外文名稱 dc["title_eng"] = list_str(tree.xpath("//h2/text()")) # 標準編號 dc["standard_number"] = list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[0]))) # 釋出單位 dc["publishing_department"] = list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[1]))) # 釋出日期 dc["release_date"] = date_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[2]))) # 狀態 dc["state"] = list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[3]))) # 實施日期 dc["enforcement_date"] = date_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[4]))) # 開本頁數 dc["pages"] = list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[5]))) # 採用關係 dc["adopted"] = adopted_ls(list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[6]))), []) # 中圖分類號 dc["clc"] = code_ls(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[7]))) # 中國標準分類號 dc["ccs"] = code_ls(tree.xpath("//span[text()='%s']/following-sibling::*/child::*/text()"%(s[8]))) # 國際標準分類號 dc["ics"] = code_ls(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[9]))) # 國別 dc["country"] = list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[10]))) # 關鍵詞 dc["keywords"] = keywords_ls(tree.xpath("//span[text()='%s']/following-sibling::*/child::*/text()"%(s[11]))) # 摘要 dc["summary"] = summary_str(tree.xpath("//span[text()='%s']/parent::*/following-sibling::*/text()"%(s[12]))) # 替代標準 dc["replace_for"] = replace_str(tree.xpath("//div[@id='replaceStandard']//child::*//text()")) return dc # 主函式 def main(): db = get_db() collection=db.standard collection2 = db.standard_cleaned for item in collection.find({}, {"content":1,"_id":0}): if item.has_key('content') and item['content']: dc = standard_dict(item['content']) collection2.insert(dc) if __name__ == '__main__': main() # 以下程式碼用於測試清洗特定一條資料 # db = get_db() # collection=db.standard # collection2 = db.standard_cleaned # data = get_data(collection, 8) # dc = standard_dict(data) # collection2.insert(dc) # for k,v in dc.items(): # print k,v # # 以下程式碼用於測試提取摘要 # data = requests.get('http://d.wanfangdata.com.cn/Standard/ISO%208528-5-2013') # dc = standard_dict(data.text) # for k,v in dc.items(): # print k,v # # 以下程式碼用於測試修改日期格式 # l1 = [u"2017年6月28日"] # l2 = [u"2017年10月27日"] # l3 = [u"2017年12月1日"] # l4 = [u"2017年7月1日"] # print date_str(l1) # print date_str(l2) # print date_str(l3) # print date_str(l4)