最近在学习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把Word题库转成Excle题库.py 内容概要: python把Word题库转成Excle题库.py是一个Python脚本,旨在将Word格式的题库转换为Excel格式的题库。该脚本使用Python的docx和openpyxl库来读取和写入Word...
本教程将聚焦于如何从C++中导出类到Python,这样你就可以在Python环境中利用C++的强大性能和效率。这通常通过Python的C API或者第三方库如SWIG(Simplified Wrapper and Interface Generator)来实现。 **C++导出类...
python+flask微信小程序订餐系统源码 python+flask微信小程序订餐系统源码python+flask微信小程序订餐系统源码 python+flask微信小程序订餐系统源码python+flask微信小程序订餐系统源码 ...
《Python在高校教师资格考试题库制作中的应用》 Python,一种强大且易学的编程语言,被广泛应用于教育和考试领域,特别是在制作题库方面展现出了其独特的优越性。本题库“高校教资 ‘第三部分 综合’题库”,就是...
81个Python爬虫源代码,内容包含新闻、视频、中介、招聘、图片资源等网站的爬虫资源
3. **加载Python模块**:通过`PyImport_ImportModule()`函数,可以在C++程序中加载Python模块,这些模块可以包含处理Word文档的Python脚本。 4. **调用Python函数**:一旦模块加载成功,就可以使用`PyObject*`指针...
本资源“C++调用Python脚本(例程)”提供了一个完整的工程实例,演示了如何在C++程序中动态地调用Python脚本,使得C++能够利用Python的灵活性和便利性。 在C++中调用Python脚本主要有两种方法:一种是通过Python的...
在使用Python 3时,有时会遇到需要安装Microsoft Visual C++ Build Tools的情况,这通常是因为Python的一些扩展模块是用C或C++编写的,而这些语言的编译器是Visual C++ Build Tools提供的。本文将深入探讨Python 3...
在Python编程中,有时我们需要利用已有的C++库或者DLL(动态链接库)来扩展功能,这通常通过Python的`ctypes`模块实现。`ctypes`是Python的一个标准库,它允许我们直接调用C语言编译的动态链接库,从而实现了Python...
2. **初始化Python解释器**:在C++程序启动时,需要初始化Python解释器,设置必要的环境,例如`Py_Initialize()`和`Py_Finalize()`。 3. **导入Python模块和对象**:使用C API中的函数,如`PyImport_ImportModule()...
总的来说,Python调用C++函数是提高Python程序性能的一种有效手段,它结合了Python的易用性和C++的高性能,实现了两者的最佳融合。通过学习和实践上述方法,开发者可以更好地利用这两种语言的优点,构建高效且易于...
Python是一种广泛应用于Web开发、数据分析、人工智能等多个领域的高级编程语言,其简洁明了的语法使得初学者也能快速上手。在IT行业中,Python爬虫是获取网络数据的重要工具,尤其对于数据挖掘、网站分析和自动化...
Python语言基础知识点总结 Python是一种高级的、解释型的编程语言,它支持面向对象、命令式、函数式和过程式编程风格。Python语言的设计目标是提高开发者的生产力和代码的可读性。 1. Python基本语法 Python语言...
一、 填空题 1、 Python安装扩展库常用的是_工具。...(sqrt) 3、 Python程序文件扩展名主要有__和两种,其中后者常用于GUI程序。(py、pyw) 4、 Python源代码程序编译后的文件扩展名为___。(pyc)
"Python 简答题复习题库 1" 本资源摘要信息涵盖了 Python 语言的多个方面,包括内存管理、运算符、模块导入、脚本程序、列表操作、逻辑运算符、字符串驻留机制、异常处理、pdb 调试模块等。 1. 简单解释 Python ...
Python爬虫是一种自动化程序,用于从互联网上抓取大量数据。在这个项目中,我们将使用Python的requests库来发送HTTP请求,获取网页内容;BeautifulSoup库解析HTML或XML文档,提取所需的数据;以及可能用到的Selenium...
根据提供的文件内容,可以整理出以下关于Python程序设计的相关知识点: 1. Python语言技术特点: - Python语言是一种解释型、高级、通用的脚本语言,具有良好的通用性,适用于多种程序设计相关应用的开发。 - ...
这是一个Python源代码文件,很可能包含了用于生成和管理题库的程序。Python的pandas库可能是用于读取和处理Excel数据的,例如"高等教育学.xlsx"。这个Excel文件可能包含了题目的内容、选项、正确答案以及题目类型...