`

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"

 

 

分享到:
评论

相关推荐

    python计算机二级题库(附带答案)

    python计算机二级题库(附带答案)python计算机二级题库(附带答案)python计算机二级题库(附带答案)python计算机二级题库(附带答案)python计算机二级题库(附带答案)python计算机二级题库(附带答案)python...

    使用Python爬去C语言题库资源

    使用Python爬去网页中的C语言题库,并解决Python爬去乱码的问题

    python小程序8 python小程序8 python小程序8 python小程序8

    "Python小程序8"可能指的是一个系列教程或者项目,专注于通过Python编写小型实用程序或应用程序。在学习和实践中,掌握Python小程序的开发能帮助我们更好地理解和应用Python语言。 Python的核心特性包括动态类型、...

    C++调用python,免安装python环境运行

    本项目"**C++调用python,免安装python环境运行**"提供了一种解决方案,使得C++程序能够调用Python脚本,而且不需要预先在目标系统上安装Python环境。 首先,要实现C++调用Python,通常会用到Python的`Python.h`...

    从C++导出类到Python

    本教程将聚焦于如何从C++中导出类到Python,这样你就可以在Python环境中利用C++的强大性能和效率。这通常通过Python的C API或者第三方库如SWIG(Simplified Wrapper and Interface Generator)来实现。 **C++导出类...

    Python制作的高校教师资格考试 高校教资 “第三部分 综合”题库

    《Python在高校教师资格考试题库制作中的应用》 Python,一种强大且易学的编程语言,被广泛应用于教育和考试领域,特别是在制作题库方面展现出了其独特的优越性。本题库“高校教资 ‘第三部分 综合’题库”,就是...

    Python程序设计题库

    【Python程序设计题库】 Python是一种广泛使用的高级编程语言,其特点是简单易学,语法简洁,接近自然语言,因此很适合初学者。Python是免费开源的,可以在多种平台上运行,具备良好的可移植性。它是一种面向对象的...

    81个Python爬虫源代码

    81个Python爬虫源代码,内容包含新闻、视频、中介、招聘、图片资源等网站的爬虫资源

    基于C++和Python混合编程的WORD文档操作方法1

    3. **加载Python模块**:通过`PyImport_ImportModule()`函数,可以在C++程序中加载Python模块,这些模块可以包含处理Word文档的Python脚本。 4. **调用Python函数**:一旦模块加载成功,就可以使用`PyObject*`指针...

    C++调用Python并传参

    C#调用C++,C++调用Python并传参,包括C++向python传递图片数据,C++向python传递组数据,C++向python传递字符串数据,C++向python传递结构体数据,C++初始化python类数据并调用方法,实际案例,能直接运行,需要安装...

    Python 3 安装 Microsoft Visual C++ Build Tools 问题

    在使用Python 3时,有时会遇到需要安装Microsoft Visual C++ Build Tools的情况,这通常是因为Python的一些扩展模块是用C或C++编写的,而这些语言的编译器是Visual C++ Build Tools提供的。本文将深入探讨Python 3...

    C++调用PYthon脚本(例程)

    本资源“C++调用Python脚本(例程)”提供了一个完整的工程实例,演示了如何在C++程序中动态地调用Python脚本,使得C++能够利用Python的灵活性和便利性。 在C++中调用Python脚本主要有两种方法:一种是通过Python的...

    python爬虫课件+代码.zip

    Python爬虫技术是一种用于自动化网络数据获取的编程技术,它在大数据分析、网站维护、市场研究等领域具有广泛应用。本课程由“路飞学城樵夫”老师指导,通过实际操作帮助学习者掌握Python爬虫的基本原理和实战技巧。...

    Python中调用C++dll例子

    在Python编程中,有时我们需要利用已有的C++库或者DLL(动态链接库)来扩展功能,这通常通过Python的`ctypes`模块实现。`ctypes`是Python的一个标准库,它允许我们直接调用C语言编译的动态链接库,从而实现了Python...

    python C++包装类

    2. **初始化Python解释器**:在C++程序启动时,需要初始化Python解释器,设置必要的环境,例如`Py_Initialize()`和`Py_Finalize()`。 3. **导入Python模块和对象**:使用C API中的函数,如`PyImport_ImportModule()...

    python爬虫20个案例

    讲诉python爬虫的20个案例 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    linux 下 python调用c或者c++编写的代码使用案例

    在Linux环境下,Python作为一种强大的脚本语言,常常需要与C或C++等底层语言交互以提升性能或利用现有的C/C++库。本案例提供了解决这一需求的四种不同方法,适用于那些希望在Python中调用C或C++代码的开发者。下面...

    python调用C++函数

    总的来说,Python调用C++函数是提高Python程序性能的一种有效手段,它结合了Python的易用性和C++的高性能,实现了两者的最佳融合。通过学习和实践上述方法,开发者可以更好地利用这两种语言的优点,构建高效且易于...

    基于python的蓝桥杯练习系统题库

    基于python的蓝桥杯练习系统题库 基于python的蓝桥杯练习系统题库 基于python的蓝桥杯练习系统题库 基于python的蓝桥杯练习系统题库 基于python的蓝桥杯练习系统题库 基于python的蓝桥杯练习系统题库 基于...

Global site tag (gtag.js) - Google Analytics