第十五章 Python和Web

第十五章 Python和Web

本章讨论Python Web编程的一些方面。
三个重要的主题:屏幕抓取、CGI和mod_python

屏幕抓取

屏幕抓取是通过程序下载网页并从中提取信息的过程。
下载数据并对其进行分析

从Python Job Board(http://python.org/jobs)提取招聘单位的名称和网站。
在这里插入图片描述

from urllib.request import urlopen
import rep = re.compile('<a href="(/jobs/\\d+)/">(.*?)</a>')
text = urlopen('http://python.org/jobs').read().decode()
for url,name in p.findall(text):print('{}({})'.format(name,url))#结果为:
'''
PhD Position in Computer Simulation &amp; Machine Learning(/jobs/6173)
Data Engineering Senior Lead(/jobs/6172)
Python Systems / Infrastructure Engineer(/jobs/6171)
Django Backend Engineer(/jobs/6170)
Senior Full Stack Engineer(/jobs/6169)
Head of Software Engineering - Python (Python Stack/ Django / FinTech / Google Cloud) – Johannesburg(/jobs/6168)
Senior Software Engineer (Remote)(/jobs/6166)
(Senior) Software Engineer (80-100%, f::m::d)(/jobs/6164)
Senior Backend Developer (Python)(/jobs/6163)
Python/GoLang Developer (Web Scraping)(/jobs/6161)
Scientific Software Developer(/jobs/6160)
Sr. Developer for Python, Django(/jobs/6159)
Data Scientist(/jobs/6156)
Data Scientist (Delivery)(/jobs/6155)
Backend Software Engineer(/jobs/6152)
Senior Python Developer (remote)(/jobs/6151)
REMOTE PYTHON/REACT JOBS(/jobs/6150)
Remote Python Developer(/jobs/6149)
Senior Python Developer(/jobs/6148)
Data Engineer(/jobs/6147)
Distinguished Machine Learning Engineer(/jobs/6146)
Senior Python Engineer(/jobs/6145)
Full Stack Software Engineer(/jobs/6144)
Open Source Engineering Manager(/jobs/6143)
Senior Python Engineer(/jobs/6142)
'''

Tidy和XHTML解析

1,Tidy是什么?
Tidy是用于对格式不正确且不严谨的HTML进行修复的工具。
Tidy并不能修复HTML文件存在的所有问题,但确实能够确保文件是格式良好的(即所有元素都嵌套正确)

2,获取Tidy
找出可供使用的包装器: pip search tidy
安装PyTidyLib:pip install pytidylib

3,为何使用XHTML
XHTML和旧式HTML的主要区别在于,XHTML非常严格,要求显式地结束所有的元素。
在HTML中,可通过(使用标签<p>)开始另一个段落来结束当前段落,但在XHTML中,必须先(使用标签</p>)显式地结束当前段落。
XHTML是一种XML方言,可使用各种出色的工具(如XPath)来处理。
要对Tidy生成的格式良好的XHTML进行解析,一种非常简单的方式是使用标准库模块html.parser中的HTMLParser类。

4,使用HTMLParser
使用HTMLParser意味着继承它,并重写各种事件处理方法。

HTMLParser中的回调方法

回调方法何时被调用
handle_starttag(tag, attrs)遇到开始标签时调用。attrs是一个由形如(name, value)的元组组成的序列
handle_startendtag(tag, attrs)遇到空标签时调用。默认分别处理开始标签和结束标签
handle_endtag(tag)遇到结束标签时调用
handle_data(data)遇到文本数据时调用
handle_charref(ref)遇到形如&#ref;的字符引用时调用
handle_entityref(name)遇到形如&name;的实体引用时调用
handle_comment(data)遇到注释时;只对注释内容调用
handle_decl(decl)遇到形如<!..>的声明时调用
handle_pi(data)用于处理指令
unknown_decl(data)遇到未知声明时调用

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

from urllib.request import urlopen 
from html.parser import HTMLParserdef isjob(url):try:a, b, c, d = url.split('/')except ValueError:return Falsereturn a == d == '' and b == 'jobs' and c.isdigit()class Scraper(HTMLParser):in_link = False #使用了一个布尔状态变量(属性)来跟踪是否位于相关的链接中def handle_starttag(self, tag, attrs): #handle_starttag的参数是一个由形如(key, value)的元组组成的列表attrs = dict(attrs) #因此使用dict将它们转换为字典,以便管理url = attrs.get('href', '')if tag == 'a' and isjob(url):self.url = urlself.in_link = Trueself.chunks = []def handle_data(self, data):if self.in_link:self.chunks.append(data)def handle_endtag(self, tag):if tag == 'a' and self.in_link:print('{} ({})'.format(''.join(self.chunks), self.url)) #为了(在方法handle_endtag中)输出结果,将所有的文本块合并在一起。self.in_link = Falsetext = urlopen('http://python.org/jobs').read().decode() 
parser = Scraper() 
parser.feed(text) #为运行这个解析器,调用其方法feed将并text作为参数
parser.close() #然后调用其方法close。'''
PhD Position in Computer Simulation & Machine Learning (/jobs/6173/)
Data Engineering Senior Lead (/jobs/6172/)
Python Systems / Infrastructure Engineer (/jobs/6171/)
Django Backend Engineer (/jobs/6170/)
Senior Full Stack Engineer (/jobs/6169/)
Head of Software Engineering - Python (Python Stack/ Django / FinTech / Google Cloud) – Johannesburg (/jobs/6168/)
Senior Software Engineer (Remote) (/jobs/6166/)
(Senior) Software Engineer (80-100%, f::m::d) (/jobs/6164/)
Senior Backend Developer (Python) (/jobs/6163/)
Python/GoLang Developer (Web Scraping) (/jobs/6161/)
Scientific Software Developer (/jobs/6160/)
Sr. Developer for Python, Django (/jobs/6159/)
Data Scientist (/jobs/6156/)
Data Scientist (Delivery) (/jobs/6155/)
Backend Software Engineer (/jobs/6152/)
Senior Python Developer (remote) (/jobs/6151/)
REMOTE PYTHON/REACT JOBS (/jobs/6150/)
Remote Python Developer (/jobs/6149/)
Senior Python Developer (/jobs/6148/)
Data Engineer (/jobs/6147/)
Distinguished Machine Learning Engineer (/jobs/6146/)
Senior Python Engineer (/jobs/6145/)
Full Stack Software Engineer (/jobs/6144/)
Open Source Engineering Manager (/jobs/6143/)
Senior Python Engineer (/jobs/6142/)
'''

Beautiful Soup

Beautiful Soup是一个小巧而出色的模块,用于解析你在Web上可能遇到的不严谨且格式糟糕的HTML。
下载并安装Beautiful Soup:pip install beautifulsoup4

使用Beautiful Soup的屏幕抓取程序

from urllib.request import urlopen 
from bs4 import BeautifulSoup
text = urlopen('http://python.org/jobs').read() 
soup = BeautifulSoup(text, 'html.parser')
jobs = set() 
for job in soup.body.section('h2'): #使用soup.body来获取文档体,再访问其中的第一个section。 使用参数'h2'调用返回的对象。jobs.add('{} ({})'.format(job.a.string, job.a['href'])) #属性string是链接的文本内容,而a['href']为属性href。print('\n'.join(sorted(jobs, key=str.lower)))
'''
(Senior) Software Engineer (80-100%, f::m::d) (/jobs/6164/)
Backend Software Engineer (/jobs/6152/)
Data Engineer (/jobs/6147/)
Data Engineering Senior Lead (/jobs/6172/)
Data Scientist (/jobs/6156/)
Data Scientist (Delivery) (/jobs/6155/)
Distinguished Machine Learning Engineer (/jobs/6146/)
Django Backend Engineer (/jobs/6170/)
Full Stack Software Engineer (/jobs/6144/)
Head of Software Engineering - Python (Python Stack/ Django / FinTech / Google Cloud) – Johannesburg (/jobs/6168/)
Open Source Engineering Manager (/jobs/6143/)
PhD Position in Computer Simulation & Machine Learning (/jobs/6173/)
Python Systems / Infrastructure Engineer (/jobs/6171/)
Python/GoLang Developer (Web Scraping) (/jobs/6161/)
Remote Python Developer (/jobs/6149/)
REMOTE PYTHON/REACT JOBS (/jobs/6150/)
Scientific Software Developer (/jobs/6160/)
Senior Backend Developer (Python) (/jobs/6163/)
Senior Full Stack Engineer (/jobs/6169/)
Senior Python Developer (/jobs/6148/)
Senior Python Developer (remote) (/jobs/6151/)
Senior Python Engineer (/jobs/6142/)
Senior Python Engineer (/jobs/6145/)
Senior Software Engineer (Remote) (/jobs/6166/)
Sr. Developer for Python, Django (/jobs/6159/)
'''

使用CGI创建动态网页

通用网关接口(CGI)
CGI是一种标准机制,Web服务器可通过它将(通常是通过Web表达提供的)查询交给专用程序,并以网页的方式显示查询结果。
要让CGI脚本能够通过Web进行访问(和运行),必须将其放在Web服务器能够访问的地方、添加!#行并设置合适的文件权限。
对于重要的Web应用,大多数人都不会直接为其编写CGI脚本,而是选择使用Web框架,因为它会替你完成很多繁重的工作。

Python Web应用框架

名称网站
Djangohttps://djangoproject.com
TurboGearshttp://turbogears.org
web2pyhttp://web2py.com
Grokhttps://pypi.python.org/pypi/grok
Zope2https://pypi.python.org/pypi/Zope2
Pyramidhttps://trypyramid.com
Flaskhttp://flask.pocoo.org

Web服务:更高级的抓取

鉴于实现Web服务的方式众多(且涉及大量的协议),同时每个Web服务系统都可能提供多种服务,因此有时必须以客户端能够自动解读的方式描述服务,这被称为元服务
有关这种描述的标准是Web服务描述语言(WSDL)。
WSDL是一种XML格式,描述了通过服务可使用哪些方法以及这些方法的参数和返回值等方面。
除支持SOAP等服务协议外,很多乃至大部分Web服务工具包都支持WSDL。

RSS和相关内容

RSS指的是富网站摘要(Rich Site Summary)、RDF网站摘要(RDF Site Summary)或简易信息聚合(Really Simple Syndication),具体指哪个取决于版本。
在最简单的情况下,RSS是一种以XML方式列出新闻的格式。

使用XML—RPC进行远程过程调用

除简单的RSS下载和解析机制外,还有远程过程调用。远程过程调用是对基本网络交互的抽象:客户端程序请求服务器程序执行计算并返回结果,但这个过程被伪装成简单的过程(函数或方法)调用。

在客户端代码中,远程过程调用看起来就像普通方法调用,但用来调用方法的对象实际上位于另一台计算机中。

XML-RPC可能是最简单的远程过程调用机制,它使用HTTP和XML来实现网络通信。

SOAP

SOAP也是一种将XML和HTTP用作底层技术的消息交换协议。
与XML-RPC一样,SOAP也支持远程过程调用,但SOAP规范比XML-RPC规范复杂得多。
SOAP是异步的,支持有关路由的元请求,而且类型系统非常复杂(而XML-RPC使用简单而固定的类型集)。

小结

概念解释
屏幕抓取指的是自动下载网页并从中提取信息。程序Tidy及其库版本是很有用的工具,可用来修复格式糟糕的HTML,然后使用HTTML解析器进行解析。另一种抓取方式是使用Beautiful Soup,即便面对混乱的输入,它也可以处理。
CGI通用网关接口是一种创建动态网页的方式,这是通过让Web服务器运行、与客户端程序通信并显示结果而实现的。模块cgi和cgitb可用于编写CGI脚本。CGI脚本通常是在HTML表单中调用的。
Flask一个简单的Web框架,让你能够将代码作为Web应用发布,同时不用过多操心Web部分。
Web应用框架要使用Python开发复杂的大型Web应用,Web应用框架必不可少。对简单的项目来说,Flask是不错的选择;但对于较大的项目,你可能应考虑使用Django或TurboGears。
Web服务Web服务之于程序犹如网页之于用户。可以认为,Web服务让你能够以更抽象的方式进行网络编程。常用的Web服务标准包括RSS(以及与之类似的RDF和Atom)、XML-RPC和SOAP。

本章介绍的新函数

函数描述
cgitb.enable()在CGI脚本中启用栈跟踪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构基础笔记】【图】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、图的概念2、图的存储形式1、邻接矩阵&#xff1a;2、邻接表3、代码定义邻接表3、图的创建4、深度优先搜索DFS5、广度优先搜索BFS6、实例分析前言 本章总结&#xff1a;图的概念、图的存储形式、邻接表定义、图的创建、图…

如何蹭网

引言蹭网&#xff0c;在普通人的眼里&#xff0c;是一种很高深的技术活&#xff0c;总觉得肯定很难&#xff0c;肯定很难搞。还没开始学&#xff0c;就已经败给了自己的心里&#xff0c;其实&#xff0c;蹭网太过于简单。我可以毫不夸张的说&#xff0c;只要你会windows的基本操…

android对象缓存,Android简单实现 缓存数据

前言1、每一种要缓存的数据都是有对应的versionCode&#xff0c;通过versionCode请求网络获取是否需要更新2、提前将要缓存的数据放入assets文件夹中&#xff0c;打包上线。缓存设计代码实现/*** Created by huangbo on 2017/6/19.** 主要是缓存的工具类** 缓存设计&#xff1a…

通信原理.绪论

今天刚上通信原理的第一节课&#xff0c;没有涉及过多的讲解&#xff0c;只是讲了下大概的知识框架。现记录如下&#xff1a; 目录1、基本概念消息、信息与信号2、通信系统模型1、信息源2、发送设备3、信道4、接收设备5、信宿6、模拟通信系统模型7、数字通信系统模型8、信源编…

css rgba透明_rgba()函数以及CSS中的示例

css rgba透明Introduction: 介绍&#xff1a; Functions are used regularly while we are developing a web page or website. Therefore, to be a good developer you need to master as many functions as you can. This way your coding knowledge will increase as well …

犀牛脚本:仿迅雷的增强批量下载

迅雷的批量下载满好用。但是有两点我不太中意。在这个脚本里会有所增强 1、不能设置保存的文件名。2、不能单独设置这批下载的线程限制。 使用方法 // 下载从编号001到编号020的图片&#xff0c;保存名为猫咪写真*.jpg 使用6个线程 jdlp http://bizhi.zhuoku.com/bizhi/200804/…

android 服务端 漏洞,安卓漏洞 CVE 2017-13287 复现详解-

2018年4月&#xff0c;Android安全公告公布了CVE-2017-13287漏洞。与同期披露的其他漏洞一起&#xff0c;同属于框架中Parcelable对象的写入(序列化)与读出(反序列化)的不一致所造成的漏洞。在刚看到谷歌对于漏洞给出的补丁时一头雾水&#xff0c;在这里要感谢heeeeenMS509Team…

GAP(全局平均池化层)操作

转载的文章链接&#xff1a; 为什么使用全局平均池化层&#xff1f; 关于 global average pooling https://blog.csdn.net/qq_23304241/article/details/80292859 在卷积神经网络的初期&#xff0c;卷积层通过池化层&#xff08;一般是 最大池化&#xff09;后总是要一个或n个全…

zoj1245 Triangles(DP)

/* 动态三角形&#xff1a;每次DP时考虑的是两个子三角形的高度即可 注意&#xff1a; 三角形可以是倒置的。 */ View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <stdio.h> 5 6 using namespace std; 7 8…

android编程从零开始,从零开始学习android开发

博主最近开通了Android栏目&#xff0c;现在正在从零开始学习android&#xff0c;遇到的所有值得分享的知识点以及遇到的问题将发布在这个博客的android栏目下。因为我有着深厚的java底子&#xff0c;所以学习起来得心应手&#xff0c;十分的简单&#xff0c;当然也只能算是入门…

CNN基本步骤以及经典卷积(LeNet、AlexNet、VGGNet、InceptionNet 和 ResNet)网络讲解以及tensorflow代码实现

课程来源&#xff1a;人工智能实践:Tensorflow笔记2 文章目录前言1、卷积神经网络的基本步骤1、卷积神经网络计算convolution2、感受野以及卷积核的选取3、全零填充Padding4、tf描述卷积层5、批标准化(BN操作)6、池化Pooling7、舍弃Dropout8、卷积神经网络搭建以及参数分析2、经…

第十九章 趣味编程

第十九章 趣味编程 本章将介绍一些通用的Python编程指南。 为何要有趣 Python有趣的地方之一就是让用户的编程效率非常高效。 极限编程是一种软件开发方法 编程柔术 python的灵活性描述原型设计Python的优点之一是让你能够快速地编写程序。要更深入地了解面临的问题&#…

【数据结构基础笔记】【顺序表】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、创建顺序表2、顺序表插入元素3、顺序表删除元素4、顺序表实例分析1、静态2、动态5、顺序表总结前言 本章总结&#xff1a;从静态和动态分别进行顺序表的创建、插入、删除、以及实例分析 1、创建顺序表 1、静态地生成一张…

关于《加密与解密》的读后感----对dump脱壳的一点思考

偶然翻了一下手机日历&#xff0c;原来今天是夏至啊&#xff0c;时间过的真快。ISCC的比赛已经持续了2个多月了&#xff0c;我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦&#xff0c;但感觉还是很幸运的&#xff0c;能在大三的时候遇到ISCC&#xff0c;不管怎样&…

【数据结构基础笔记】【链表】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、链表基础2、创建一个链表3、插入结点4、删除结点5、销毁链表6、实例分析前言 本章总结&#xff1a;链表的定义、创建、销毁&#xff0c;结点的插入与删除 1、链表基础 链表的物理存储结构是用一组地址任意的存储单元存储…

视频图像质量评价

目录1、人眼视觉特性1、眼的适应性2、对比灵敏度3、空间分辨率和时间分辨率4、马赫效应5、可见度阈值2、图像质量测度3、图像评价方法4、图像评价方法的优劣1、人眼视觉特性 1、眼的适应性 暗适应性&#xff1a;从亮环境到暗环境&#xff0c;适应暗环境的特性 亮适应性&#…

recovery编译问题汇总

1、修改支持USB大容量存储 &#xff08;1&#xff09;、首先需要查看手机lun位置 手机链接电脑&#xff0c;打开cmd命令行&#xff0c;依次输入以下命令: adb shell find /sys -name "lun" 输出以下结果&#xff1a; 发现手机输出结果有两个&#xff0c;需要进一步查…

【数据结构基础笔记】【栈】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、栈的定义2、创建一个栈3、入栈和出栈操作4、栈的清空、销毁、计算栈的当前容量5、实例分析前言 本章总结&#xff1a;栈的定义、创建栈&#xff0c;销毁栈&#xff0c;入栈出栈操作等操作。 1、栈的定义 栈是一种重要的…

用HTML语言制作list标记,html5 datalist标签的用法是什么?这里有datalist标签的用法实例...

本篇文章主要为大家讲述了关于html5 datalist标签的用法及html5 datalist标签的用法实例。本文说了两个常用的选项框的实例供大家选择观看&#xff0c;下面就让我们一起来看这篇文章吧我们先来看看html5 datalist标签的用法&#xff1a;标签定义选项列表。请与input元素配合使用…

【数据结构基础笔记】【队列】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、队列定义2、创建一个队列3、入队列4、出队列5、销毁一个队列6、循环队列的概念7、循环队列的实现8、实例分析前言 本章总结&#xff1a;链队列定义&#xff0c;创建&#xff0c;出队入队操作&#xff0c;销毁操作&#x…