`

python 爬某高校C++题库小程序

 
阅读更多

最近在学习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"

 

 

分享到:
评论

相关推荐

    VB+ACCESS高校题库管理系统设计(源代码+论文).rar

    ssm整合开发,小程序毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统...

    2020全国高校计算机能力挑战赛模拟题10道(题目+答案)

    在这些模拟题中,参赛者可能需要运用到基本的编程语言知识,如C++、Java或Python。了解变量、数据类型、控制结构(如循环和条件语句)、函数的使用是必备的基础。此外,掌握递归、动态规划等高级编程技巧也是提高...

    传智播客入学测试题附答案

    2. **编程语言**:传智播客通常教授Java、Python、C++、JavaScript等主流编程语言。测试题可能包括语法、数据类型、控制结构、函数、类与对象等核心概念。 3. **算法与数据结构**:这是任何程序员必备的基础,测试...

    2019寒假蓝桥杯刷题.zip

    8. 编程语言选择:在蓝桥杯竞赛中,C/C++、Java、Python等都是常用的编程语言。选择合适自己的编程语言并熟练掌握其语法和库函数对于竞赛成功至关重要。 9. 时间管理与策略:参赛者在准备竞赛时,需要合理安排时间...

    基于A*算法的往返式全覆盖路径规划改进及其Matlab实现

    内容概要:本文详细介绍了如何利用A*算法改进传统的往返式路径规划,解决扫地机器人在复杂环境中容易卡住的问题。首先构建了一个可视化的栅格地图用于模拟环境,然后引入了优先级运动规则,使机器人能够有规律地进行往返清扫。当遇到死角时,通过A*算法计算最佳逃生路径,确保机器人能够顺利脱困并继续完成清扫任务。实验结果显示,改进后的算法显著提高了清洁覆盖率,降低了路径重复率。此外,还讨论了一些潜在的优化方向,如动态调整启发函数权重、断点续传以及能耗模型等。 适合人群:对路径规划算法感兴趣的科研人员、自动化专业学生、扫地机器人开发者。 使用场景及目标:适用于需要高覆盖率和低重复率的室内清洁任务,旨在提高扫地机器人的工作效率和智能化水平。 其他说明:文中提供了详细的Matlab代码实现,并附带了仿真测试结果,有助于读者理解和复现该算法。

    爬取喜马拉雅听书(1).py

    爬取喜马拉雅听书(1)

    安卓向上传递数据学习笔记总结

    安卓向上传递数据学习笔记总结

    tigervnc-selinux-1.11.0-9.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统tigervnc-selinux-1.11.0-9.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf tigervnc-selinux-1.11.0-9.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    户外储能电源双向逆变器板生产资料及技术规格详解

    内容概要:本文详细介绍了户外储能电源双向逆变器板的技术资料及其特点。涵盖原理文件、PCB文件、源代码、电感与变压器规格参数等,适用于2KW(最大3KW)的户外储能电源。文中强调了双向软开关DC-DC设计、两颗M0+ 32位MCU的分工、SPWM调制方式、H桥IGBT的应用、详细的电气参数和技术特性。此外,还包括了SPWM信号生成代码示例、硬件设计细节、生产注意事项等。 适合人群:从事户外储能电源开发的技术人员、电子工程师、产品经理等。 使用场景及目标:帮助开发者快速掌握双向逆变器板的设计和生产要点,缩短产品研发周期,提高产品质量和可靠性。具体应用场景包括但不限于户外应急电源、便携式储能设备等。 其他说明:本文提供了丰富的技术细节和实践经验,如双向软开关DC-DC设计、SPWM调制、IGBT驱动、EMC整改记录等,有助于解决实际开发中的难题。同时,附带的实际案例展示了该方案的成功应用,进一步证明了其可行性和优越性。

    电能质量分析:间谐波分析.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

    【计算机科学领域】美国计算机学会(ACM):组织架构、使命愿景、核心价值及活动项目介绍

    内容概要:美国计算机学会(ACM)是一个成立于1947年的国际性计算机专业组织,致力于推动计算机科学的发展,提供教育、资源和专业发展机会。ACM的使命是促进计算机科学和信息技术领域的进步,愿景是成为全球计算机专业人士的首选组织。其核心价值包括卓越、诚信、包容性、合作和创新。ACM定期举办学术会议,如SIGGRAPH和图灵奖颁奖典礼,出版高质量的学术期刊和会议论文集,涵盖人工智能、软件工程、网络安全等领域。此外,ACM还提供在线课程、研讨会、认证项目等教育资源,以及职业规划、网络机会和领导力培训等职业发展服务。ACM图灵奖被誉为“计算机界的诺贝尔奖”,每年颁发给对计算机科学和技术做出重大贡献的个人。; 适合人群:计算机科学领域的专业人士、教育工作者、工程师和学生。; 使用场景及目标:①了解计算机科学领域的最新研究成果和发展趋势;②获取高质量的教育资源和职业发展机会;③参与计算机科学领域的学术交流和合作。; 其他说明:ACM作为一个全球性的组织,在教育、研究和行业实践中发挥着重要作用,推动了技术创新和社会进步。

    最新版logstash-8.17.4-windows-x86-64.zip

    logstash-8.17.4-windows-x86_64.zip

    一个基于Springboot使用Aspect实现一个切面,以记录日志为例

    springboot 一个基于Springboot使用Aspect实现一个切面,以记录日志为例

    音箱底部折边设备sw22可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    音箱底部折边设备sw22可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    基于Python Django MySQL的个性化图书推荐系统:协同过滤算法及远程部署实现

    内容概要:本文详细介绍了如何使用Python、Django和MySQL构建一个完整的个性化图书推荐系统。系统从前端界面设计、后端逻辑实现到数据库设计,涵盖了用户管理、图书管理、评分系统等功能模块。重点讲解了基于用户和项目的协同过滤算法实现,以及在用户评分数据不足时的标签推荐备份方案。此外,还包括了系统部署、测试和优化的具体步骤,如云服务器部署、性能测试、数据库优化等。 适合人群:具备一定Python和Web开发基础的研发人员,尤其是对推荐系统感兴趣的技术爱好者。 使用场景及目标:适用于希望深入了解图书推荐系统的工作原理和实现细节的技术人员。目标是帮助读者掌握从零开始搭建一个完整的个性化推荐系统的方法,包括前后端开发、算法实现和系统部署。 其他说明:文中提供了大量代码示例和实战经验,如数据库设计、爬虫实现、权限管理等,有助于读者更好地理解和应用相关技术。

    Ai和python学习资料

    Ai和python学习资料

    文本摘要.py

    文本摘要

    冲击试验机sw22_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    冲击试验机sw22_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    Java开发MybatisPlus框架详解:增强Mybatis功能实现高效CRUD操作与代码生成

    内容概要:本文详细介绍了MyBatis Plus(MP),它是MyBatis的增强工具,旨在简化CRUD操作、提高开发效率。其主要功能包括内置分页插件、简化CRUD操作以及代码生成器。使用时只需引入相应依赖,自定义Mapper接口继承BaseMapper泛型接口,并通过实体类反射获取数据库表信息。文章还介绍了常用注解如@TableName、@TableId、@TableField、@TableLogic和@Version,配置项如全局配置、类型别名和Mapper文件路径,以及核心功能如批量插入、分页查询、条件构造器(Wrapper)等。此外,扩展功能涵盖逻辑删除、枚举处理器和JSON处理器,插件功能则包括分页插件的配置和使用。 适合人群:具备一定Java开发经验,尤其是熟悉MyBatis框架的开发者,特别是那些希望提高开发效率、减少重复代码的工作1-3年研发人员。 使用场景及目标:①简化数据库操作,提高开发效率;②快速生成代码,减少手动编写SQL语句的工作量;③实现分页查询、逻辑删除、枚举和JSON字段处理等高级功能,提升应用的灵活性和可维护性。 其他说明:本文不仅提供了MyBatis Plus的功能介绍和使用方法,还深入探讨了条件构造器(Wrapper)的使用技巧,帮助开发者更好地理解和掌握这一强大的工具。在实际开发中,合理利用这些功能可以显著提高开发效率和代码质量。建议在学习过程中结合具体项目实践,逐步掌握各个功能的应用场景和最佳实践。

    电路仿真:射频电路仿真.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

Global site tag (gtag.js) - Google Analytics