# zhouxianglh 2013.05.03 python3.3 # Python 模拟登录,然后记录cookie,之后获取公司OA主页公文信息 import urllib.request import http.cookiejar from html.parser import HTMLParser import re import os import shutil # 公文HTML下载目录 filePath = "D:\\temp" # 初始化文件目录 if os.path.isdir(filePath): shutil.rmtree(filePath) elif os.path.isfile(filePath): os.remove(filePath) os.makedirs(filePath) # 登录并获取最新的公文列表 params = {"username":"??????", "password":"???????"} webCookie = http.cookiejar.CookieJar() openner = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(webCookie)) webRequest = openner.open("http://192.168.8.109/default.asp", urllib.parse.urlencode(params).encode()) webRequest = openner.open("http://192.168.8.109/noticelook.asp") htmlData = webRequest.read().decode('gbk') # 网页是用gbk编码,所以这里用gbk编码 # map,用于记录首页的公文URL OApages = {} # 解析HTML,HTMLParser为系统默认的解析方式,HTML文件具有容错性,所以最好不使用xml解析 # 解析公文首页的公文列表 class MyHtmlParser(HTMLParser): _a_Flag = False _a_title = "" def handle_starttag(self, tag, attrs): if tag == "a": # 解析公文相关的URL for pageUrl in attrs: if pageUrl[0] == 'href': self._a_Flag = True self._a_URL = pageUrl[1] self._a_URL = self._a_URL.replace("javascript:openwin('", "http://192.168.8.109/") self._a_URL = self._a_URL.replace("');", "") def handle_data(self, data): if self._a_Flag : self._a_title = self. _a_title + data def handle_endtag(self, tag): if tag == "a": self._a_title = re.sub("\W", "", self._a_title) OApages[self._a_URL] = self._a_title self._a_title = "" self._a_Flag = False MyHtmlParser().feed(htmlData) # 转码URL中的中文字符串 def encoderForUrl(strURL): # 0 将非特殊字符串替换掉 _tempStr = re.sub("[a-z\d&/:.?=]+", ";", strURL) # 1 获取中文字符串 _tempStrArr = _tempStr.split(";") # 2用中文转码后的字符串替换中文字符串 for _tempStrValue in _tempStrArr: strURL = strURL.replace(_tempStrValue, urllib.parse.quote(_tempStrValue)) return strURL # 下载公文内容 print("公文首面共", len(OApages), "条公文") for url, title in OApages.items(): url = encoderForUrl(url) # 这里的URL里面的参数抱括中文,例如name=小胖子,直接使用会出错,所以要将其转码 webRequest = openner.open(url) htmlData = webRequest.read().decode('gbk') dataFile = open(filePath + os.sep + title + ".html", "w") dataFile.write(htmlData) print("写入公文:", title, "成功")
以上是使用Python获取公司OA的公文HTML的代码