1.屏幕抓取:可以使用urllib获取网页的HTML源代码,然后使用正则表达式提取信息即可。下面是一个例子:
这种方法有至少3个缺点:如果HTML代码比较复杂,则表达式会乱七八糟不可维护。程序对于CDATA部分和字符实体(比如&)之类的HTML特性是无法处理的。正则表达式被HTML源代码约束,而不是取决于更抽象的结构,这就意味着网页结构中很小的改变就会导致程序中断。接下来会有两种方案解决这个程序所产生的问题,第一个方案是使用叫做Tidy的程序和XHTML解析;第二个方案则使用Beautiful Soup库,它专门为屏幕抓取设计。现在假设有个叫做messy.html的混乱的HTML文件,下面的程序会对该文件运行Tidy,然后打印结果:
3.使用HTMLParser:上面获得了格式良好的XHTML代码之后,我们就可以使用标准库模块HTMLParser进行解析了。我们只需继承HTMLParser并且对handle_starttage或handle_data等事件处理方法进行覆盖。下图总结了一些相关的方法,以及解析器在何时对它们进行自动调用。
下面的这段代码是使用HTMLParser模块获取网页:
4.Beautiful Soup:下载BeautifulSoup.py文件,将它放置在python路径中(比如python安装文件夹里面的site-packages目录)。下面的例子是使用它进行屏幕抓取的程序:
5.使用CGI创建动态网页:6.简单的CGI脚本:例子如下:
例子中的Content-type这行表明页面是普通文件,如果页面为HTML,这一行应该是这样:print 'Content-type: text/html'。8.使用cgi模块:我们通常需要脚本接收任何形式的输入。输入是通过HTML表单提供给CGI脚本的键值对或称字段。可以使用cgi模块的FieldStorage类从CGI脚本中获取这些字段。当创建FieldStorage实例时(应该只创建一个),它会从请求中获取输入变量(或者字段),然后通过类字典借口将它们提供给程序。FieldStorage的值可以通过普通的键查找方式访问。获取值的简单方式就是用getvalue()方法,它类似于字典的get方法,但它会返回项目的value特性的值。如:form=cgi.FieldStorage();name=form.getvalue('name','unknow')这里我提供了一个默认值,如果不提供的话,就会将None作为默认值使用,默认值用于字段没有值的情况。下面是一个完整的简单例子:
CGI脚本的输入一般都是从已经提交的web表单中获得,但是也可以直接使用参数调用CGI程序,如http://www.someserver.com/simple.cgi?name=a&age=1。使用urllib模块的urlencode方法可以创建此类的URL查询:urllib.urlencode("name":"a","age":"1");9.创建表单:如下:
在脚本的开始处先获取CGI参数name,使用默认的'world'。如果打开浏览器而不提交任何东西,程序使用默认值。10.mod_python:安装,在unix上首先下载mod_python的源代码,然后解压缩,进入目录。接着运行mod_python的configure脚本:./configure --with-apxs=/usr/local/apache/bin/apxs,如果apxs不在这个位置,需要修改apxs程序的路径。然后编译所有的文件:make。接着就是安装了:make install。在windows上可以在http://www.apache.org/dist/httpd/modpython/win上下载,然后双击运行即可。配置apache:找到为特定模块使用的apache配置文件,文件通常叫做httpd.conf或者apache.conf,在unix中增加LoadModule python_module lobexec/mod_python.so,在windows中增加LoadModule python_module modules/mod_python.so。现在apache指导到哪里找mod_python了,但是还是不能使用:得告诉它什么时候去找。必须在apache的配置文件中增加几行代码,可以在主配置文件中(可能是commonapache2.conf)或者放在名为.htaccess的文件中,该文件所在目录中有用于web访问的脚本。下面假设使用.htaccess文件,如果有的话,可以像下面这样将指令打包:
如果要使用CGI处理程序,要将下面的代码放在放置CGI脚本所在目录中的.htaccess文件内:
需要调试信息的话,加上PythonDebug On即可。当开发完成之后应该取出这些指令。如果需要支持PSP页面需要加上如下代码:
下面是一个带有少量随机数据的PSP例子: