`

【Python真的很强大】开发简易在线搜索

阅读更多
  •  需求如下:开发一个简易的搜索引擎(即提供查询关键字的服务)
  • 程序思路及模型: python构建一个Http Server;提供用户输入的一个静态页面;用户提交请求后,把请求再转发到其他站点,最后把结果(动态页面)传给用户
  • 下面是程序原型模型(使用python 2.7编写,没有使用第三方library/module),没有任何优化,主要演示Http Server构建过程,Html Parser使用,调用本地浏览器进行体验等。
  • #为方便测试,所有代码都编写于一个文件
    #没有保存到本地数据库(sqllite)
    #没有递归下载所有数据
    import os,subprocess
    import sys
    import SimpleHTTPServer
    import SocketServer
    import logging
    import cgi
    from HTMLParser import HTMLParser
    import urllib2,urllib
    
    htmlContent='''<!DOCTYPE html>
    <html>
    	<head>
                    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    		<style type="text/css">
    			.myform {
    				COLOR: #ffffff; BACKGROUND-COLOR: skyblue; BORDER-RIGHT: rgb(0,0,0) 1px dashed; BORDER-TOP: rgb(0,0,0) 1px dotted; BORDER-LEFT: rgb(0,0,0) 1px dotted; BORDER-BOTTOM: rgb(0,0,0) 1px dotted
    			}
    			li a {
      			 display:block;
    			}
    		</style>
    	</head>
    <body>
    <div class="myform">
    	
    <form action="/" method="post">
    	Search Keyword:	 <input type="text" name="keyword" value="UIC"><input type="submit" value="Submit">
    </form>
    
    </div>
    
    <ul>
       search:result
    </ul>
    
    <p>The above is parts of result for searching.</p>
    
    </body>
    </html>
    '''
    
    def openUrlInDefaultBrowser(url):
    	if sys.platform=='win32':
    		os.startfile(url)
    	elif sys.platform=='darwin':
    		subprocess.Popen(['open', url])
    	else:
    		try:
    			subprocess.Popen(['xdg-open', url])
    		except OSError:
    				print 'Please open a browser on: '+url
    
    
    
    if len(sys.argv) > 2:
        PORT = int(sys.argv[2])
    elif len(sys.argv) > 1:
        PORT = int(sys.argv[1])
    else:
        PORT = 8899
    
    
    
    
    class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    
        def do_GET(self):
            logging.warning("======= GET STARTED =======")
            logging.warning(self.headers)
            self.wfile.write(htmlContent.replace('search:result',''))
             
    
        def do_POST(self):
            logging.warning("======= POST STARTED =======")
            logging.warning(self.headers)
            form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={'REQUEST_METHOD':'POST',
                         'CONTENT_TYPE':self.headers['Content-Type'],
                         })
            logging.warning("======= POST VALUES =======")
            for item in form.list:
                logging.warning(item)
            logging.warning("\n")
            q=form.getvalue("keyword")
            if q:
            	p = MyHTMLParser()
            	f = urllib2.urlopen('http://uic.edu.hk/en/component/search/?searchword=%s&searchphrase=all&Itemid=108' % (q))
            	html = f.read()
            	p.feed(html)
            	total = len(p.urls)
            	item = 0
            	urls = []
            	while item < total:
            		url = "<li><a href=\"%s%s\">%s</a></li>" % ("http://uic.edu.hk",p.urls[item].strip(),p.titles[item].strip())
            		urls.append(url)
            		item += 1
            	p.close()
            	self.wfile.write(htmlContent.replace('UIC',q).replace('search:result',''.join(urls)))
            else:
            	self.wfile.write(htmlContent.replace('search:result',''))
    
            	
    
    class MyHTMLParser(HTMLParser):
    
      def __init__(self):
        HTMLParser.__init__(self)
        self.recording = 0
        self.findHref = 0
        self.urls = [] 
        self.titles = []
      def handle_starttag(self, tag, attrs):
        if tag == 'dt':
          for name, value in attrs:
            if name == 'class' and value == 'result-title':
              print name, value
              self.recording = 1
              self.findHref = 0
        if tag == 'a' and self.recording == 1:
        	for name, value in attrs:
        		if name == 'href':
        			print name,value
        			self.urls.append(value)
        			self.recording = 1
        			self.findHref = 1
              
      def handle_endtag(self, tag):
        if tag == 'dt':
          self.recording -= 1 
        if tag == 'a' and self.findHref == 1:
        	self.findHref -= 1 
    
      def handle_data(self, data):
        if self.findHref:
          self.titles.append(data)
                  	        	
    Handler = ServerHandler
    httpd = SocketServer.TCPServer(("", PORT), Handler)
    
    print "author:sunflowerbbs@gmail.com from UC Studio, Python http server version 1.0 (for testing purposes only)"
    
    
    openUrlInDefaultBrowser("http://%s:%d" % ("localhost", PORT))
    httpd.serve_forever()
    
     
分享到:
评论

相关推荐

    基于python实现使用Python制作简易数字累加器源码

    通俗来讲,Python 是一种少有的、既简单又功能强大的编程语言,它注重的是如何解决问题而不是编程语言的语法和结构。 2.Python的应用范围 Python 在通用应用程序、自动化插件、网站、网络爬虫、数值分析、科学计算...

    基于python实现使用Python制作简易数字累加器源码分享

    通俗来讲,Python 是一种少有的、既简单又功能强大的编程语言,它注重的是如何解决问题而不是编程语言的语法和结构。 2.Python的应用范围 Python 在通用应用程序、自动化插件、网站、网络爬虫、数值分析、科学计算...

    python项目简易SNMP的管理站工具.zip

    综上所述,Python开发的简易SNMP管理站工具是一个实用的网络管理解决方案,尤其适合于需要快速部署且成本敏感的环境。通过利用PySNMP库的强大功能,开发者可以轻松地创建出符合自身需求的网络管理工具。

    基于python实现简易时钟程序源码

    通俗来讲,Python 是一种少有的、既简单又功能强大的编程语言,它注重的是如何解决问题而不是编程语言的语法和结构。 2.Python的应用范围 Python 在通用应用程序、自动化插件、网站、网络爬虫、数值分析、科学计算...

    python166简易SNMP的管理站工具.zip

    同时,Python拥有丰富的开源库和框架,如Django、Flask、OpenCV等,为项目开发提供了强大的支持。 这些项目的开发旨在为用户提供便捷、智能的服务和功能。Python语言具备广泛的应用领域,从机器学习、自然语言处理...

    Python-一个清晰简洁简单但功能强大的API用于深入学习

    一个清晰,简洁,简单但功能强大的API,用于深入学习

    WingPro 7 for Mac(Python开发工具) v7.1.3.0

    还支持代码折叠、重构以及多选等特色化操作,既增加交互式python的开发速度,同时在原有的开发环境下更能体现出软件内置编辑器的强大功能,在良好适应远程开发的基础上也能更加展现出软件简易的操作形式和编码风格。

    Python手把手教程.rar

    Python是一种易于学习且功能强大的编程语言,非常适合初学者入门。无论你是希望了解数据科学、网页开发,还是想进行自动化操作,Python都是一个优秀的选择。以下是一份简易的Python入门教程。 一、安装Python 首先...

    基于Flask与CodeMirror的Python在线交互教学平台源码

    项目概述:本项目是一款基于Python的在线交互教学平台,采用...简而言之,此平台通过现代化的Web技术栈,将Flask的简易性与CodeMirror的强大代码编辑功能相结合,打造出一个高效、直观的Python在线学习和教学环境。

    简易图片服务器

    Python开发的简易图片服务器,支持分布式集群(需Nginx配合),支持图片上传/下载/删除/鉴权,支持图片同步备份(需Rsync配合),短小精悍,功能强大。

    Python实现简易Web爬虫详解

    假设互联网是一张很大的蜘蛛网,每个页面之间都通过超链接这根线相互连接,那么我们的爬虫小程序就能够通过这些线不断的搜寻到新的网页。Python作为一种代表简单主义思想的解释型、面向对象、功能强大的高级编程语言...

    pythonFlask:个人轻量型网站

    python Flask Flask是轻量级的网页伺服器,但一样有完整强大的功能Flask是可以遵循自已的需求,而通过pip套件管理程序来扩展功能Flask提供网络服务器核心的基本功能,其余的由扩展套件来增加功能Flask具有三个核心...

    基于Django的简易博客.zip

    Django是一个高级的Python Web框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django负责处理网站开发中麻烦的部分,可以专注于编写应用程序,而无需重新开发。它是免费和开源的,有活跃繁荣的社区...

    基于Django 的简易博客.zip

    Django是一个高级的Python Web框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django负责处理网站开发中麻烦的部分,可以专注于编写应用程序,而无需重新开发。它是免费和开源的,有活跃繁荣的社区...

    D语言简易教程

    D 语言既有 C 语言的强大威力,又有 Python 和 Ruby 的开发效率。它是一种集垃圾回收、手工内存操作、契约式设计、高级模板技术、内嵌汇编、内置单元测试、Mixin 风格多继承、类 Java 包管理机制、内置同步机制、内...

    这是一个使用MATLAB制作的简易图像处理系统.zip

    6. **集成能力**:MATLAB可以与其他编程语言(如C、C++、Java、Python等)及外部应用程序进行数据交换和联合开发,也可以调用硬件接口进行实时实验和控制。 7. **交互式工作空间**:用户可以在命令窗口中直接输入...

    用 C++ 11/14 编写的跨平台 DSP 库_C++_代码_下载

    eDSP(简易数字信号处理)是一种用现代 C++ 编写的数字信号处理框架,它实现了数字信号处理、音频工程和电信系统中经常使用的一些常见功能和算法。 它旨在提供高效和简化的基础计算,同时具有类似于MATLAB等另一种...

    SDL入门教程.pdf

    SDL是Simple DirectMedia Layer(简易直控媒体层)的缩写。它是一个跨平台的多媒体库,以用于直接控制底层的多媒体硬件的接口。...这是很宽松的法律,你可以用如此强大的多媒体库完全合法的免费开发商业游戏。

Global site tag (gtag.js) - Google Analytics