用于mongodb中“标准”数据的清洗,数据为网页源代码,须从中提取:

标准名称,标准外文名称,标准编号,发布单位,发布日期,状态,实施日期,开本页数,采用关系,中图分类号,中国标准分类号,国际标准分类号,国别,关键词,摘要,替代标准。

提取后组成字典存入另一集合。

  1. #coding=utf-8
  2. from pymongo import MongoClient
  3. from lxml import etree
  4. import requests
  5.  
  6. s = [u'标准编号:',u'发布单位:',u'发布日期:',u'状态:',u'实施日期:',u'开本页数:',u'采用关系:',
  7. u'中图分类号:',u'中国标准分类号:',u'国际标准分类号:',u'国别:',u'关键词:',u'摘要:']
  8.  
  9. # 获取数据库
  10. def get_db():
  11. client = MongoClient('IP', 27017)
  12. db = client.wanfang
  13. db.authenticate("用户名","密码")
  14. return db
  15.  
  16. # 获取第num条数据
  17. def get_data(table, num):
  18. i = 1
  19. for item in table.find({}, {"content":1,"_id":0}):
  20. if i==num:
  21. if item.has_key('content') and item['content']:
  22. return item['content']
  23. else:
  24. i+=1
  25. continue
  26.  
  27. # 列表转字符串
  28. def list_str(list):
  29. if len(list)!=0:
  30. return list[0]
  31. else:
  32. return ""
  33.  
  34. # 提取分类号
  35. def code_ls(list):
  36. if len(list)!=0:
  37. ls = list[0].split()
  38. shanchu = []
  39. for i in ls:
  40. if ("("in i) or (")"in i) or ("("in i) or(")"in i):
  41. shanchu.append(i)
  42. for i in shanchu:
  43. ls.remove(i)
  44. return ls
  45. else:
  46. return ""
  47.  
  48. # 构造关键词列表
  49. def keywords_ls(list):
  50. if len(list)!=0:
  51. return list
  52. else:
  53. return ""
  54.  
  55. # 替代标准
  56. def replace_str(replace):
  57. if replace!="":
  58. ls = [i.strip().replace("\r\n", "") for i in replace]
  59. if len(ls)!=0:
  60. return ls[0][5:]
  61. else:
  62. return ""
  63. else:
  64. return ""
  65.  
  66. # 提取摘要
  67. def summary_str(list):
  68. if len(list)!=0:
  69. if list[0][0]!="<":
  70. return list[0]
  71. else:
  72. return ""
  73. else:
  74. return ""
  75.  
  76. # 调整日期格式
  77. def date_str(list):
  78. if len(list)!=0:
  79. year = list[0].find(u'年')
  80. month = list[0].find(u'月')
  81. day = list[0].find(u'日')
  82. if month-year==2:
  83. list[0] = list[0].replace(u"年",u"年0")
  84. if day-month==2:
  85. list[0] = list[0].replace(u"月",u"月0")
  86. return list[0].replace(u"日","").replace(u"月","-").replace(u"年","-")
  87. else:
  88. return ""
  89.  
  90. # 调整采标格式
  91. def adopted_ls(string, ls):
  92. dc = {}
  93. loc = string.find(',')
  94. if loc==-1:
  95. return ls
  96. else:
  97. dc["code"] = string[:loc].strip()
  98. dc["type"] = string[loc+1:loc+4]
  99. ls.append(dc)
  100. return adopted_ls(string[loc+4:],ls)
  101.  
  102. # 构造标准入库字典
  103. def standard_dict(html):
  104. dc = {}
  105. tree = etree.HTML(html)
  106. # 标准名称
  107. dc["title"] = list_str(tree.xpath("//h1/text()"))
  108. # 外文名称
  109. dc["title_eng"] = list_str(tree.xpath("//h2/text()"))
  110. # 标准编号
  111. dc["standard_number"] = list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[0])))
  112. # 发布单位
  113. dc["publishing_department"] = list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[1])))
  114. # 发布日期
  115. dc["release_date"] = date_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[2])))
  116. # 状态
  117. dc["state"] = list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[3])))
  118. # 实施日期
  119. dc["enforcement_date"] = date_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[4])))
  120. # 开本页数
  121. dc["pages"] = list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[5])))
  122. # 采用关系
  123. dc["adopted"] = adopted_ls(list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[6]))), [])
  124. # 中图分类号
  125. dc["clc"] = code_ls(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[7])))
  126. # 中国标准分类号
  127. dc["ccs"] = code_ls(tree.xpath("//span[text()='%s']/following-sibling::*/child::*/text()"%(s[8])))
  128. # 国际标准分类号
  129. dc["ics"] = code_ls(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[9])))
  130. # 国别
  131. dc["country"] = list_str(tree.xpath("//span[text()='%s']/following-sibling::*/text()"%(s[10])))
  132. # 关键词
  133. dc["keywords"] = keywords_ls(tree.xpath("//span[text()='%s']/following-sibling::*/child::*/text()"%(s[11])))
  134. # 摘要
  135. dc["summary"] = summary_str(tree.xpath("//span[text()='%s']/parent::*/following-sibling::*/text()"%(s[12])))
  136. # 替代标准
  137. dc["replace_for"] = replace_str(tree.xpath("//div[@id='replaceStandard']//child::*//text()"))
  138. return dc
  139.  
  140. # 主函数
  141. def main():
  142. db = get_db()
  143. collection=db.standard
  144. collection2 = db.standard_cleaned
  145. for item in collection.find({}, {"content":1,"_id":0}):
  146. if item.has_key('content') and item['content']:
  147. dc = standard_dict(item['content'])
  148. collection2.insert(dc)
  149.  
  150. if __name__ == '__main__':
  151. main()
  152.  
  153. # 以下代码用于测试清洗特定一条数据
  154. # db = get_db()
  155. # collection=db.standard
  156. # collection2 = db.standard_cleaned
  157. # data = get_data(collection, 8)
  158. # dc = standard_dict(data)
  159. # collection2.insert(dc)
  160. # for k,v in dc.items():
  161. # print k,v
  162.  
  163. # # 以下代码用于测试提取摘要
  164. # data = requests.get('http://d.wanfangdata.com.cn/Standard/ISO%208528-5-2013')
  165. # dc = standard_dict(data.text)
  166. # for k,v in dc.items():
  167. # print k,v
  168.  
  169. # # 以下代码用于测试修改日期格式
  170. # l1 = [u"2017年6月28日"]
  171. # l2 = [u"2017年10月27日"]
  172. # l3 = [u"2017年12月1日"]
  173. # l4 = [u"2017年7月1日"]
  174. # print date_str(l1)
  175. # print date_str(l2)
  176. # print date_str(l3)
  177. # print date_str(l4)

Python 自用代码(某方标准类网页源代码清洗)的更多相关文章

  1. Python 自用代码(知网会议论文网页源代码清洗)

    #coding=utf-8 from pymongo import MongoClient from lxml import etree import requests jigou = u" ...

  2. Python 自用代码(递归清洗采标情况)

    将‘ISO 3408-1-2006,MOD  ISO 3408-2-1991,MOD  ISO 3408-3-2006,MOD’类似格式字符串存为: [{'code': 'ISO 3408-1-200 ...

  3. Python 自用代码(调整日期格式)

    2017年6月28日 to 2017-06-282017年10月27日 to 2017-10-272017年12月1日 to 2017-12-012017年7月1日 to 2017-07-01 #co ...

  4. Python 自用代码(拆分txt文件)

    现有一个28G的txt文件,里面每一行是一个分词过的专利全文文档,一共370多万行.我需要把它按每五万行为单位做成一个json文件,格式大致如下: [{"id":"100 ...

  5. Python 自用代码(scrapy多级页面(三级页面)爬虫)

    2017-03-28 入职接到的第一个小任务,scrapy多级页面爬虫,从来没写过爬虫,也没学过scrapy,甚至连xpath都没用过,最后用了将近一周才搞定.肯定有很多low爆的地方,希望大家可以给 ...

  6. (Python)自动生成代码(方法一)

    在写某个平台的自动化脚本时,笔者把全部的操作都封装到了两个类中,page.py和commonpage.py: page.py部分代码: class BasePage(object): ''' 页面基础 ...

  7. python代码规范与标准库参考

    python代码规范与标准库参考 python代码规范参考文献: http://www.runoob.com/w3cnote/google-python-styleguide.html https:/ ...

  8. 【代码笔记】Java基础:Java的方法和类

    面向过程与面向对象都是我们编程中,编写程序的一种思维方式.例如:公司打扫卫生(擦玻璃.扫地.拖地.倒垃圾等), 按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生 ...

  9. python开发面向对象基础:接口类&抽象类&多态&钻石继承

    一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...

随机推荐

  1. mysql索引语法及示例

    注:本篇文章是对菜鸟教程中的mysql索引(http://www.runoob.com/mysql/mysql-index.html)的翻译版本:添加了示例,便于理解: 索引分单列索引和组合索引.单列 ...

  2. jquery请求格式和返回类型 汇总

    常规请求基本格式 1 [WebMethod] 2 public string SayHello(string name) 3 { 4 return "Hello " + name; ...

  3. linux查看cpu内存信息

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  4. cvCalcOpticalFlowPyrLK的使用--基于高斯金字塔的稀疏光流特征集求解

    void cvCalcOpticalFlowPyrLK( const CvArr* prev, const CvArr* curr, CvArr* prev_pyr, CvArr* curr_pyr, ...

  5. HDU 1029 Ignatius and the Princess IV(数论)

    #include <bits/stdc++.h> using namespace std; int main(){ int n; while(~scanf("%d",& ...

  6. 2017中国大学生程序设计竞赛 - 女生专场C【前后缀GCD】

    C HDU - 6025 [题意]:去除数列中的一个数字,使去除后的数列中所有数字的gcd尽可能大. [分析]: 数组prefixgcd[],对于prefixgcd[i]=g,g为a[0]-a[i]的 ...

  7. 最小生成树 (Minimum Spanning Tree,MST) --- Prim算法

    本文链接:http://www.cnblogs.com/Ash-ly/p/5409904.html 普瑞姆(Prim)算法: 假设N = (V, {E})是连通网,TE是N上最小生成树边的集合,U是是 ...

  8. HDU 3507 Print Article(斜率优化推导)

    $dp$,斜率优化. 第一次做斜率优化的题目,看了一些题解,自己总结一下. 这题是说有$n$个数字,可以切成任意段,每一段的费用是这一段数字的和平方加上$M$.问最小费用是多少. 设$dp[i]$为$ ...

  9. usaco1.4.3等差数列

    为这道苟题鼓掌 题目: 一个等差数列是一个能表示成a, a+b, a+2b,…, a+nb (n=0,1,2,3,…)的数列.在这个问题中a是一个非负的整数,b是正整数.写一个程序来找出在双平方数集合 ...

  10. 树链剖分【p4116】Qtree3 - Query on a tree

    Description 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑 ...