设为首页 收藏本站
查看: 1004|回复: 0

[经验分享] python 爬某高校C++题库小程序

[复制链接]

尚未签到

发表于 2017-5-7 13:32:46 | 显示全部楼层 |阅读模式
  最近在学习C++,爬下一些题来,用于平时练手。
  原理其实也很简单,就是生成页面链接,下载网页,提取内容,保存为xml。
  用到正则表达式来匹配,minidom来生成xml文件。
  (相关URL已更改,题库将上传到sae的网页)

#coding:utf8
# c++ exercises crawler by bosshida,2014.1.2
import urllib2
import re
import string
from xml.dom import minidom
# regex pattern for problem page
pNamePattern = re.compile("<h2.*?>(.*?)</h2>",re.S)
# regex pattern for problem description
pDescPattern = re.compile('<td.*?background="srcs/bg_mid.gif".*?>(.*?)</td>',re.S)
# regex pattern for input, output, sampleInput, sampleOutput
pPrePattern = re.compile("<pre.*?>(.*?)</pre>",re.S)
# generate problem set page url
def genProblemSetUrl(count):
pSetUrl = "http://xxx.edu.cn:8080/JudgeOnline/problemset.jsp?vol=%d" % count
#pSetUrl = "/Users/apple/Dropbox/pysrc/problem%d" % count
#pSetUrl = pSetUrl + ".htm"
return pSetUrl
# get next problem url by regex
def getAllProblemUrl(page):
pUrls = re.findall('<a href="(problem.jsp\?id=\d+)">',page, re.S)
return pUrls
# download page content
def loadPage(url):
response = urllib2.urlopen(url)
content = response.read()
return content
# get problem name
def getProblemName(page):
pNameMatch = pNamePattern.search(page)
return pNameMatch.group(1) if pNameMatch!=None else None
# get problem Description
def getProblemDesc(page):
pDescMatch = pDescPattern.search(page)
return pDescMatch.group(1) if pDescMatch!=None else None
# get input content
def getInputContent(page):
pInput = pPrePattern.findall(page)[0]
return pInput
# get output content
def getOutputContent(page):
pOutput = pPrePattern.findall(page)[1]
return pOutput
# get sample input
def getSampleInput(page):
pSampleInput = pPrePattern.findall(page)[2]
return pSampleInput
# get sample output
def getSampleOutput(page):
pSampleOutput = pPrePattern.findall(page)[3]
return pSampleOutput
# class for xml
class XmlGenerator:
def __init__(self, xmlName):
self.doc = minidom.Document()
self.xmlName = xmlName
def createNode(self, nodeName):
return self.doc.createElement(nodeName)
def addNode(self, node, prevNode = None):
curNode = node
if prevNode is not None:
prevNode.appendChild(curNode)
else:
self.doc.appendChild(curNode)
return curNode
def setNodeAttr(self, node, attName, value):
curNode = node
curNoee.setAttribute(attName, value)
def setNodeValue(self, curNode, value):
nodeData = self.doc.createTextNode(value)
curNode.appendChild(nodeData)
def genXml(self):
f = open(self.xmlName, "w")
f.write(self.doc.toprettyxml(indent="\t", newl="\n", encoding="utf8"))
f.close()
path = "D://test.xml"
xmlGen = XmlGenerator(path)
rootNode = xmlGen.createNode("root")
xmlGen.addNode(node=rootNode)
count = 0
while count < 6:
pSetUrl = genProblemSetUrl(count+1)
print pSetUrl
html = loadPage(pSetUrl)
for pageUrl in getAllProblemUrl(html):
pageUrl = "http://xxx.edu.cn:8080/JudgeOnline/" + pageUrl
print pageUrl
pPage = loadPage(pageUrl)
pPage_gbk = unicode(pPage, "gbk")
pName = getProblemName(pPage_gbk)
pDesc = getProblemDesc(pPage_gbk)
pInput = getInputContent(pPage_gbk)
pOutput = getOutputContent(pPage_gbk)
pSampleInput = getSampleInput(pPage_gbk)
pSampleOutput = getSampleOutput(pPage_gbk)
problemNode = xmlGen.createNode("problem")
pUrlNode = xmlGen.createNode("url")
xmlGen.setNodeValue(pUrlNode, pageUrl)
xmlGen.addNode(pUrlNode, problemNode)
pNameNode = xmlGen.createNode("name")
xmlGen.setNodeValue(pNameNode, pName)
xmlGen.addNode(pNameNode, problemNode)
pDescNode = xmlGen.createNode("desc")
xmlGen.setNodeValue(pDescNode, pDesc)
xmlGen.addNode(pDescNode, problemNode)
pInputNode = xmlGen.createNode("input")
xmlGen.setNodeValue(pInputNode, pInput)
xmlGen.addNode(pInputNode, problemNode)
pOutputNode = xmlGen.createNode("output")
xmlGen.setNodeValue(pOutputNode, pOutput)
xmlGen.addNode(pOutputNode, problemNode)
pSInputNode = xmlGen.createNode("sampleInput")
xmlGen.setNodeValue(pSInputNode, pSampleInput)
xmlGen.addNode(pSInputNode, problemNode)
pSOutputNode = xmlGen.createNode("sampleOutput")
xmlGen.setNodeValue(pSOutputNode, pSampleOutput)
xmlGen.addNode(pSOutputNode, problemNode)
xmlGen.addNode(problemNode, rootNode)
xmlGen.genXml()
count += 1
print "finish"

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374245-1-1.html 上篇帖子: python--ASCII和UNICODE字符串的区别 下篇帖子: python时间和时间戳之间的转换
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表