我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python之万维网

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python之万维网

15.1 屏幕抓取

屏幕抓取是程序下载网页并且提取信息的过程。

简单的屏幕抓取程序

from urllib import urlopen

import re

p = re.compile('<h3><a .*?><a .*? href="(.*?)">(.*?)</a>')

text = urlopen('http://python.org/community/jobs').read()

for url,name in p.findall(text):

print '%s (%s)' % (name,url)

上述这个已经可以用了,但是至少有3个缺点

1.正则表达式并不是完全可读的。对于更复杂的HTML代码和查询来说,表达式会变得乱七八糟并且不可维护。

2.程序对CDATA部分和字符实体之类的HTML特性是无法处理的。如果碰到了这类特性,程序很有可能会失败。

3.正则表达式被HTML源代码约束,而不是取决于更抽象的结构。这就意味着网页结构中很小的改变就会导致程序中断。



15.1.1 Tidy和XHTML解析


1.Tidy是什么

Tidy是用来修复不规范且随意的HTML的工具。它能以相当智能的方法修复一般的错误,做那些你不愿意做的事情。它也是可设置的,也可以打开或关闭各种修改选项。

Tidy不能修复HTML文件的所有问题,但是它会确保文件的格式是正确的,这样一来解析的时候就轻松多了。


2.获取Tidy库

可以从网上下载


3.在Python中使用命令行Tidy

如果正在使用UNIX或Linux系统的话,就不信要安装任何库,因为系统可能已经包括Tidy的命令行版本。

获得二进制版本后,可以使用subprocess模块运行Tidy程序。假设有个叫做messy.html的混乱的HTML文件,那么下面的程序会对该文件运行Tidy,然后打印结果:


from subprocess import Popen,PIPE

text = open('messy.html').read()

tidy = Popen('tidy',stdin=PIPE,stdout=PIPE,stderr=PIPE)

tidy.stdin.write(text)

tidy.stdin.close()

print tidy.stdout.read()


4.但为什么用XHTML

XHTML和旧版本的HTML之间的最主要区别是XHTML对于显式关闭所有元素要求更加严格。所以HTML中可能只用一个开始标签(<p>标签)结束一段然后开始下一段,而在XHTML中首先需要显示地关闭当前段落。这种行为让XHTML更容易解析,因为可以直接告诉程序什么时候进入或者离开各种元素。XHTML的另外一个好处是它是XML的一种,所以可以对它使用XML的工具,例如Xpath。


解析这类从Tidy中获得的表现良好的XHTML的方法是使用标准库模块HTMLParser。


5.使用HTMLParser

使用HTMLParser的意思是继承它,并且对handle_starttage或handle_data等事件处理方法进行覆盖。

如果要进行屏幕抓取,一般不需要实现所有的解析器回调,也可能不用创造整个文档的抽象表示法来查找自己需要的内容。如果只需要记录所需信息的最小部分,那么就足够了。


使用HTMLParser模块的屏幕抓取程序

from urllib import urlopen

from HTMLParser import HTMLPaeer

class Scraper(HTMLParser):

in_h3 = False

in_link = False

def handle_starttag(self,tag,attrs):

attrs = dict(attrs)

if tag == 'h3':

self.in_h3 = True

if tag == 'a' and 'href' in attrs:

self.in_link = True

self.chunks = []

self.url = attrs['href']

def handle_data(self,data):

if self.in_link:

self.chunks.append(data)

def handle_endtag(self,tag):

if tag == 'h3':

self.in_h3 = False

if tag == 'a':

if self.in_h3 and self.in_link:

print '%s (%s)' % (''.join(self.chunks),self.url)

self.in_link = False

text = urlopen('http://python.org/community/jobs').read()

parser = Scraper()

parser.feed(text)

parser.close()

首先,没有使用Tidy,因为网页中HTML已经足够规范了。使用了一些布尔状态变量以追踪是否已经位于h3元素和链接内。在事件处理程序中检查并且更新这些变量。handle_starttag的attrs参数是由(键,值)元组组成的列表,所以使用dict函数将它们转化为字典。

handle_data方法可能还得解释一下。它使用了在处理HTML和XML这类结构化标记的基于事件的解析工作时非常常见的技术。我没有假定只掉用handle_data就能获得所有需要的文本,而是假定会通过多次调用函数获得多个文本块。这样做的原因有几个:忽略了缓冲、字符实体和标记等----只需确保获得所有文本。然后在准备输出结果时,只是将所有的文本联结在一起。可以让文本调用feed方法以运行这个解析器,然后再调用close方法。


15.1.2 Beautiful Soup

Beautiful Soup是个小模块,用来解析和经常在网上看到的那些乱七八糟而且不规则的HTML。

下载和安装beautiful Soup:下载BeautifulSoup.py文件,然后将它放置在python路径中。如果需要的话,还能下载带有安装脚本和测试的tar档案文件。

使用beautiful Soup的屏幕抓取程序

from urllib import urlopen

from BeautifulSoup import BeautifulSoup


text = urlopen('http://python.org/community/jobs').read()

soup = BeautifulSoup(text)


jobs = set()

for header in soup('h3'):

links = header('a','reference')

if not links:continue

link = links[0]

jobs.add('%s (%s)' % (link.string,link['href']))

print '\n'.join(sorted(jobs,key=lambda s: s.lower()))

用HTML文本实例化BeautifulSoup类,然后使用各种方法提取处理后的解析树的各个部分。


15.2 使用CGI创建动态网页

CGI(通用网关接口)。CGI是网络服务器可以将查询传递到专门的程序中并且在网页上显示结果的标准机制。它是创建万维网应用程序而不用编写特殊用途的应用服务器的简单方法。


Python CGI程序设计的关键工具是cgi模块。

15.2.1 第一步:准备网络服务器

15.2.2 第二步:加入Pound Bang行

当把脚本放在正确位置后,需要在脚本的开始处增加pound bang行。

#!/usr/bin/env python


15.2.3 设置文件许可

设置权限


15.2.5 简单的CGI脚本

简单的CGI脚本

#!/usr/bin/env python

print 'Content-type:text/plain'

print 

print 'hello,world'


text.plain 说明是普通文本,如果页面是HTML,这一行就是text/html


15.2.6  使用cgitb调试

调用回溯的CGI脚本

#!/usr/bin/env python

import cgitb;cgitb.enable()

print 'Content-type: text/html'

print

print 1/0

print 'hello,world'

可以通过浏览器访问下


 15.2.7 使用cgi模块

输入时通过HTML表单提供给CGI脚本的键-值对,或称字段。可以使用cgi模块的FieldStorage类从CGI脚本中获取这些字段。当创建FieldStorage实例时,它会从请求中获取输入变量,然后通过类字典接口将它们提供给程序。FieldStorage的值可以通过普通的键查找方式访问,但是因为一些技术原因,FieldStorage的元素并不是真正所要的值。比如知道请求中包括名为name的值,就不应该像下面这么做:

form = cgi.FieldStorage()

name = form['name']

而应该这样做:

form = cgi.FieldStorage()

name = form['name'].value

获取值得简单方式就是用getvalue方法,它类似于字典的get方法,但它会返回项目的value特性的值。

form = cgi.FieldStorage()

name = form.getvalue('name','Unknown')

在上面的代码,我提供了一个默认值unknown。如果不提供的话,就会将None作为默认值使用。

利用FieldStorage获取一个值得CGI脚本

#!/usr/bin/env python

import cgi

form = cgi.FieldStorage()

name = from.getvalue('name','world')

print 'Content-type:text/plain'

print

print 'Hello,%s!' % name


 CGI脚本的输入一般都是从已经提交的web表单中获得,但是也可以直接使用参数调用CGI程序。


15.2.8 简单的表单

从CGI脚本获取信息的方法有两种:GET方法和POST方法。

带有HTML表单的问候脚本

#!/usr/bin/env python

import cgi

form = cgi.FieldStorage()

name = from.getvalue('name','world')

print ""Content-type:text/html


<html>

 <head>

  <title>Greeting Page</title>

 </head>

 <body>

  <h1>hello,%s1</h1>

  <form action='simple3.cgi'>

change name <input type='text' name='name'/>

<input type='submit'/>

 </form>

 </body>

</html>

""" % name

在脚本的开始处先获取CGI参数name。


15.3 mod_python

mod_python是apache的扩展模块。


15.3.1 安装mod_python

$./configure --with-apxs=/usr/local/apache/bin/apxs

$make

$make install 


配置apache

LoadModule python_module libexec/mod_python.so


在.htaccess文件添加

<Directory /path/to/your/directory>

(add the directory here)

</Directory>



15.3.2 CGI处理程序

CGI处理程序在使用CGI的时候会模拟程序运行的环境。所以可以用mod_python运行程序,但是还可以使用gi和gitb模块把它当作CGI脚本来写。


如果要使用CGI处理程序,要将下面的代码放在CGI脚本所在目录中的.htaccess文件内

SetHandler mod_python

PythonHandler mod_python.cgihandler


需要调试信息的话,增加代码:

PythonDebug On

开发完之后,在去掉。

为了运行CGI脚本,可能需要脚本以.py结尾---尽管访问的时候还是用以.cgi结尾的URL,mod_python在查找满足请求的文件时会将.cgi转换为.py


15.3.3 PSP

PSP文档是HTML以及python代码的混合,python代码会包括在具有特殊用途的标签中。任何HTML会被转换为输出函数的调用。

只要把下面 的代码放在.htaccess文件中即可设置PSP页面:

AddHandler mod_python .psp

PythonHandler mod_python .psp


PSP标签有两类:一类用于语句,另外一类用于表达式。

带有少量随机数据的PSP例子

<%

from random import choice

adjectives = ['beautiful','cruel']

%>

<html>

 <head>

  <title>hello</title>

 </head>

 <body>

 <p>hello, <%=choice(adjectives)%> world. my name is Mr. Gumby.</p>

 </body>

</html>


<% - 像这样 -%> 书写注释。


15.3.4 发布

要使用发布处理程序,需要下面代码放在.htaccess文件中。

AddHandler mod_python .py

PythonHandler mod_python.publisher

这样可以使用发布处理程序把所有以.py当作python脚本运行。


下面的函数已经可以发布处理程序了:

def index(req):

return "hello,world"

请求对象访问受到请求中德信息,以及设置自定义HTTP首部等。


使用mod_python发布处理程序进行验证

from sha import sha

__auth_realm__ = "A simple test"

def __auth__(req,user,pswd):

return user == "Gumby" and sha(pswd).hexdigest() == \

'13hj3123012kllkjfl1'

def __access__(req,user):

return True

def index(req,name="world"):

return "<html>hello,%s!</html>" % name


15.4 网络应用程序框架


15.5 web服务:正确分析

15.5.1 RSS

15.5.2 使用XML-RPC进行远程过程调用。


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python之万维网

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python之万维网

15.1 屏幕抓取屏幕抓取是程序下载网页并且提取信息的过程。 简单的屏幕抓取程序from urllib import urlopenimport rep = re.compile('

2023-01-31

万维网是什么

万维网(World Wide Web)是基于互联网的一种信息服务系统,它由一系列通过超文本链接连接在一起的文档组成。通过使用标准化的协议和语言,如HTTP(Hypertext Transfer Protocol)和HTML(Hypertex
2023-07-10

万维网有什么优势

万维网具有以下几个主要优势:全球性和无限扩展性:万维网是一个全球性的网络,使得人们可以从世界各地访问和共享信息。它的无限扩展性意味着可以在其上创建和托管数量巨大的网页和内容。跨平台和设备无关性:万维网可以在多种操作系统上运行,并且与设备无关
2023-07-10

万维网怎么实现和发展

万维网的实现和发展涉及多个方面,包括技术、标准化、内容创造和用户需求等。以下是一些关键的实现和发展要点:技术基础设施:万维网的实现离不开互联网的基础设施。互联网提供了网络连接和数据传输的能力,使得网页可以在全球范围内进行访问和交流。同时,网
2023-07-10

万恶之源-python介绍

PATH OF PYTHON (生命短暂,我要学pythonヾ(◍°∇°◍)ノ゙)一.Python介绍:  简史:Python诞生于1989年的圣诞节, 创始人为Guido van Rossum, 又名"龟叔".  python被今年来的人
2023-01-30

云服务器如何安装iis万维网

要安装iis,你可以按照以下步骤进行:打开计算机或浏览器;在地址栏输入http://iis.webnsserver.net/(如果你的计算机名为"a");点击右上角的"安装";选择你要安装的组件(例如Web服务器、FTP客户端或者SQLServer等等),然后点击"下一步";弹出安装程序对话框,选择你要安装的系统版本(例如Windows7、Windows2000或者更高版本);选择
2023-10-26

云服务器如何安装iis万维网页

要安装iis,你可以按照以下步骤进行:打开计算机或服务器管理器;在左侧选择“本地计算机”;点击“服务和应用程序”;点击右侧的“管理服务和应用程序”;点击右侧的“服务”;在右侧点击“安装”。安装服务后,会看到如下界面:点击“开始”;在弹出的对话框中,选择“运行”;弹出“运行”窗口,输入“services.m
2023-10-26

云服务器如何安装iis万维网络

如果您是在云服务器上安装了iis,可以按照以下步骤进行安装:打开iis网站并登录。登录时需要输入iis用户名和密码,也可以使用已有的用户名和密码。单击“开始”菜单中的“命令提示符”。这将打开“命令提示符”对话框。在该对话框中,输入“mv/etc/iis/bin/iis”命令,以便在iis服务器中安装iis应用程序。单击“好”按钮继续。这将关闭“命令提示符”对话框。
2023-10-26

云服务器如何安装iis万维网页版

如果您是在Windows操作系统上进行安装iis万维网页版,您需要按照以下步骤进行操作:下载并安装iis。iis是用于网站服务器的软件,因此需要下载最新版本的iis软件。打开iis软件,并创建一个名为“localhost”的网站。使用默认的用户账户登录后,您将看到“网站”菜单。在网站上添加网站数据库,并将其存储在本地计算机上。例如,您可以在本地计算机上创建一个名为"mydata"的数据库
2023-10-26

云服务器如何安装iis万维网络驱动

如果您的云服务器是用于虚拟私有网络(VPN)的,则可以使用下面的命令安装和配置iis网络驱动:从控制台中添加驱动:在命令提示符中输入以下命令添加和配置iis网络驱动:netsh/iis/installation.exeiisinstallationaddiisinstallation.cnd这将自动安装iis服务器的iis驱动程序,并为您的网站使用。请确保您正在运行的应用程序或
2023-10-26

万恶之源 - Python基础知识补充

编码转换编码回顾:  1. ASCII : 最早的编码. ⾥⾯有英⽂⼤写字⺟, ⼩写字⺟, 数字, ⼀些特殊字符.   没有中⽂, 8个01代码, 8个bit, 1个byte  2. GBK: 中⽂国标码, ⾥⾯包含了ASCII编码和中⽂常
2023-01-30

Python运维之psutil模块

最近开始学习Python自动化运维,特记下笔记。学习中使用的系统是Kali Linux2017.2,Python版本为2.7.14+因为在KALI里面没有自带psutil模块,需要使用pip进行安装安装完成后进入python交互模式查看ps
2023-01-31

万恶之源 - Python基础数据类型一

整数整数在Python中的关键字用int来表示; 整型在计算机中运于计算和比较在32位机器上int的范围是:  -2**31~2**31-1,即-2147483648~2147483647在64位机器上int的范围是: -2**63~2**
2023-01-30

云服务器如何安装iis万维网络驱动程序

如果您的云服务器是在一个网站的Web服务器上运行,您可以使用以下步骤在iisWeb服务器上安装iis万维网络驱动程序:在计算机上找到与iisWeb服务器连接的计算机。右键单击该计算机并选择属性。在Web选项卡上,单击Web-OrientedDistributedServices(WDS)。在WDS页面上找到iisInstall按钮并单击。在iisInstall页面上,单击AutoInstall按钮以安装WDS服务器。安装完成后,您将看到安装程序出现在控制台上。请注意,如果您使...
2023-10-27

阿里云服务器没有与万维网关联怎么办?

在使用阿里云服务器的过程中,可能会遇到阿里云服务器没有与万维网关联的情况。这可能是由于多种原因导致的,如网络设置错误、服务器未正确启动、网络服务未运行等。本文将详细说明如何解决这个问题。正文:检查网络设置首先,检查阿里云服务器的网络设置。确保服务器的网络接口已经正确配置,并且已经连接到互联网。你可以通过在服务器的
阿里云服务器没有与万维网关联怎么办?
2023-11-16

运维之我的docker-python s

安装docker的python sdk[root@salt-node1 ~]#pip install docker 这里从最简单的运行一个容器开始,在容器里面运行一段命令"echo "hello" "world""In [1]: impor
2023-01-31

阿里云服务器没有与万维网链接怎么回事

简介阿里云服务器是一种基于云计算技术的虚拟服务器,它提供了强大的计算、存储和网络资源,可以用于搭建网站、应用程序和服务等。然而,有时候用户可能会遇到一个问题,即阿里云服务器没有与万维网链接,这可能会导致用户无法访问网站或使用应用程序。1.确认网络连接首先,我们需要确认阿里云服务器的网络连接是否正常。可以通过ping命令
阿里云服务器没有与万维网链接怎么回事
2024-01-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录