网页信息抓取

from urllib importurlopenimportre

p= re.compile('

(.*?)')

text= urlopen('http://python.org/community/jobs').read()for url, name inp.findall(text):print '%s (%s)' % (name, url)

这段程序有以下缺点

正则表达式读起来并不是那容易理解

程序对于CDATA部分和字符实体(比如&)

正则表达式被HTML源代码约束

对于这种有两个解决方案

程序调用Tidy(Python库),进行XHTML解析

使用Beautiful Soup库,它是专门为网页信息抓取的

还有其他的如 scrape.py

Tidy和XHTML解析

Tidy是用来修复不规范且有些随意的HTML文档的工具。当然Tidy不能修复HTML文件的所有问题,但是它会确保文件的格式正确的(就是所有元素正确的嵌套)。

Tidy相关内容

tidy  原版c语言写的tidy

utidy python包装的库,比较老了

mxtidy  python包装的库,比较老了,只支持到python2.5

jtidy 用java写的tidy

tidy-html5 c语言写的支持html5的tidy

npp-tidy2 notepad编辑器的tidy插件

Window 安装 http://binaries.html-tidy.org/  下载压缩包文件,然后解压到程序目录下。把 tidy.exe 移动到和 程序同一级目录下。

然后Python用subprocess模块中的popen函数运行tidy程序

messy.html

Pet Shop

Complaints

There is no way at allwe can accetp returned parrots.

Dead pets

Our pets may tend to rest at times. but rarely die within the warranty period.

News

We have just received a really nice parrot.

It's really nice

The Norwegian Blue

Plumage andpining behavior

More information

Features:

Beautiful plumage

tidy_test.py

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()

输出

"HTML Tidy for HTML5 for Windows version 5.2.0">

Pet Shop

Complaints

There is no way at allwe can accetp

returned parrots.

Dead pets

Our pets may tend to rest at times. but rarely die within the

warranty period.

News

We have just received a really nice parrot.

It's really nice


The Norwegian Blue

Plumage and


pining behavior

More information

Features:

  • Beautiful plumage

实际上就是在Shell里面执行语句

D:\python_basic_course\course_15>tidy messy.html

line 1 column 1 - Warning: missingdeclaration

line 1 column 1 - Warning: inserting implicit

line 1 column 1 - Warning: missing before

line 2 column 1 - Warning: missing

before line 2 column 15 - Warning: discarding unexpectedline 4 column 19 - Warning: replacing unexpected b withline 4 column 29 - Warning: inserting implicitline 6 column 5 - Warning: missing before line 8 column 4 - Warning: inserting implicitline 10 column 1 - Warning: missing before

line 8 column 4 - Warning: missing before

line 10 column 8 - Warning: inserting implicitline 10 column 17 - Warning: discarding unexpectedline 12 column 26 - Warning: missing before

line 14 column 4 - Warning: inserting implicitline 14 column 30 - Warning: isn't allowed in

elements

line 14 column 26 - Info:

previously mentioned

line 15 column 9 - Warning:


isn't allowed in

elements

line 14 column 61 - Info:

previously mentioned

line 16 column 5 - Warning: is probably intended as line 17 column 22 - Warning: discarding unexpected

line 17 column 29 - Warning: isn't allowed in elements

line 1 column 1 - Info:

previously mentioned

line 17 column 29 - Warning: inserting implicit

  • line 17 column 29 - Warning: missing

line 1 column 1 - Warning: inserting missing 'title' element

line 10 column 1 - Warning: trimming emptyInfo: Document content looks like HTML5

Tidy found 24 warnings and 0 errors!

"HTML Tidy for HTML5 for Windows version 5.2.0">

Pet Shop

Complaints

There is no way at allwe can accetp

returned parrots.

Dead pets

Our pets may tend to rest at times. but rarely die within the

warranty period.

News

We have just received a really nice parrot.

It's really nice


The Norwegian Blue

Plumage and


pining behavior

More information

Features:

  • Beautiful plumage

About HTML Tidy: https://github.com/htacg/tidy-html5

Bug reports and comments: https://github.com/htacg/tidy-html5/issues

Official mailing list: https://lists.w3.org/Archives/Public/public-htacg/

Latest HTML specification: http://dev.w3.org/html5/spec-author-view/

Validate your HTML documents: http://validator.w3.org/nu/

Lobby your company to join the W3C: http://www.w3.org/Consortium

Do you speak a language other than English, or a different variant of

English? Consider helping us to localize HTML Tidy. For details please see

https://github.com/htacg/tidy-html5/blob/master/README/LOCALIZE.md

D:\python_basic_course\course_15>

XHTML

xhtml和旧版的html之间最主要的区别是XHTML对显示关闭所有元素要求更加严格。

如 html中可能只用一个开始标签

标签结束一段然后开始下一段。而在XHTML中必须显式的关闭当前段落。

解析从Tidy中获得的XHtml然后用HTMLParser解析。

HTMLParser

使用HTMLParser意味着要生成它的一个子类,并且对handle_starttage或handle_data之类的事件处理方法进行覆盖。

HTMLParser 回调方法

handle_starttag(tag, attrs) 找到开始标签时,调用。attrs是(名称,值)对的序列

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) 处理指令时调用

htmlparser_test.py

#coding: utf-8

from urllib importurlopenfrom HTMLParser importHTMLParserclassScraper(HTMLParser):

in_h3=False

in_link=Falsedefhandle_starttag(self, tag, attrs):

attrs=dict(attrs)if tag == 'h3':

self.in_h3=Trueif tag == 'a' and 'href' inattrs:

self.in_link=True

self.chunks=[]

self.url= attrs['href']defhandle_data(self, data):ifself.in_link:

self.chunks.append(data)defhandle_endtag(self, tag):if tag == 'h3':

self.in_h3=Falseif tag == 'a':if self.in_h3 andself.in_link:

string= ''.join(self.chunks)ifisinstance(string, unicode):

string= string.encode("utf8")else:

string= unicode(string, "gb2312")

string= string.encode("utf8")print '%s (%s)' %(string, self.url)

self.in_link=False

response=Nonetry:

response= urlopen("http://www.qq.com/")exceptException as e:print "错误:下载网页时遇到问题:" +str(e)if response.code != 200:print "错误:访问后,返回的状态代码(Code)并不是预期值【200】,而是【" + str(response.code) + "】"text=response.read()

parser=Scraper()

parser.feed(text)

parser.close()

输出

台风“妮妲”登陆广东 大树被连根拔起 (http://news.qq.com/a/20160802/003497.htm)

航拍张家界玻璃栈道 绝壁凌空令人头晕目眩 (http://news.qq.com/a/20160802/006341.htm#p=1)

疯狂敛财10亿的“心灵培训班”,别无人监管 (http://view.news.qq.com/original/intouchtoday/n3605.html)

中国高铁盈利地图:东部赚翻 中西部巨亏 (http://finance.qq.com/a/20160802/005982.htm)

20万多买奥迪Q3 讴歌CDX竞品SUV最高降6万 (http://auto.qq.com/a/20160802/004725.htm)

美国男篮44分狂胜尼日利亚 奥运热身5战净胜215分 (http://sports.qq.com/nba/)

央视:房价未来怎么走?看完这个就明白了 (http://news.house.qq.com/)

韦德遭热火怠慢詹皇抱不平 称韦德是热火科比 (http://sports.qq.com/a/20160802/005100.htm)

霍建华林心如返台准备归宁宴 走商务通道避媒体 (http://ent.qq.com/a/20160802/006231.htm#p=1)

企鹅智酷:魏则西事件后,网民如何看网上就医? (http://tech.qq.com/a/20160503/006393.htm#p=1)

iPhone指纹扫描弱爆了,LG把指纹做到了屏幕里 (http://tech.qq.com/a/20160503/002791.htm)

这才是中国的奢侈品,惊艳上千年! (http://cul.qq.com/a/20160802/004627.htm#p=1)

全都输范冰冰?但比腿我站张馨予 (http://fashion.qq.com/visual/photo.shtml)

张檬又变脸了,这次真的认不出! (http://fashion.qq.com/a/20160802/008502.htm#p=1)

遭遇恐怖袭击怎么办?一个听天由命者的视角 (http://dajia.qq.com/)

星运365 8月2日12星座运势 哪个星座运势最差 (http://astro.fashion.qq.com)

星座控:从南北交点探寻你的前世今生(上) (http://astro.fashion.qq.com/original/constellationControl/NBJD.html)

点赞!河南双腿瘫痪高考生被武大录取 (http://edu.qq.com/photo/)

暑期充电助你变身学霸 (http://edu.qq.com/class/onecourse/shujiaxuexi.htm)

两只考拉树上打架 一只被打哭哈哈哈! (http://v.qq.com/cover/a/aekiwhvmdhhwa23/k00206jkl9t.html)

中国海军和平方舟医院船凯旋而归 (http://news.qq.com/a/20160127/011493.htm#p=1)

CCTV称直播行业烧钱 曝小智1.2亿被挖! (http://games.qq.com/a/20160802/000757.htm)

Sky李晓峰晒魔兽选手聚会 网友看哭:都是青春 (http://games.qq.com/a/20160802/001398.htm)

压力山大的现代人 你可以试着用佛法减压 (http://foxue.qq.com/)

净慧长老:《心经》里的一个“心”字 奥义无穷 (http://rufodao.qq.com/a/20160801/023724.htm)

存在:84岁老爹和他13岁的娃 (http://gongyi.qq.com/original/exist/oldfatherinfamily.html)

Beautiful Soup

beautifulsoup_test.py

from urllib importurlopenfrom BeautifulSoup importBeautifulSoup

text= urlopen("http://www.qq.com/").read()

soup=BeautifulSoup(text)

jobs=set()for header in soup('h3'):

links= header('a', 'reference')if notlinks:continuelink=links[0]

jobs.add('%s (%s)' % (link.string, link['href']))print '\n'.join(sorted(jobs, key=lambda s: s.lower()))

使用CGI创建动态网页

CGI 通用网关接口(Common Gateway Interface).

第一步:准备网络服务器

CGI程序必须放在通过网络可以访问的目录中。并且须将它们标识为CGI脚本,这样网络服务器就不会将普通源代码作为网页处理。

将脚本放在叫做cgi-bin的子目录中

把脚本文件扩展名改为.cgi

如果用的Apache,需要目录的ExecCGI选项。

第二步:加入Pound Bang行

当脚本放在正确位置后,需要在脚本的开始处增加 pound bang 行。没有这样的话,网络服务器不知道如何执行脚本。

(脚本可以用其他的语言来写,比如Perl或者Ruby) 只要在脚本开始处添加

#!/usr/bin/env python

注意,它一定要是第一行(之前没有空行)。如果不能正常工作,需要查看Python可执行文件的确切位置。

#!/usr/bin/python

如果还是不行确保这行是以\r\n而不是\n结尾,且文件为UNIX风格的文本文件。

在Window系统中

#!C:\Python22\python.exe

第三步:设置文件权限

确保每个人都可以读取和执行脚本文件,还要确保只有你可以写入文件。

有的时候,在Window编辑脚本文件,而它存储在UNIX磁盘服务手上(通过Samba或FTP访问文件),文件权限有可能在对文件进行更改后搞乱了。所以脚本无法执行时,请确保文件权限仍是正确的。

修改文件权限(或者文件模式)的UNIX命令是chmod。只要运行下面命令即可

chmod 755 somescript.cgi

用法:chmod XXX filename

×××(所有者\组用户\其他用户)

×=4 读的权限

×=2 写的权限

×=1 执行的权限

常用修改权限的命令:

sudo chmod 600 ××× (只有所有者有读和写的权限)

sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)

sudo chmod 700 ××× (只有所有者有读和写以及执行的权限)

sudo chmod 666 ××× (每个人都有读和写的权限)

sudo chmod 777 ××× (每个人都有读和写以及执行的权限)

关于Linux知识 可以看

如果还是不清楚怎么搭建可以看下下面文章

http://koda.iteye.com/blog/556393

http://8796902.blog.51cto.com/8786902/1560549

http://www.111cn.net/sys/Windows/63254.htm

搭建完成后,我们就可以直接访问测试了

http://localhost/cgi-bin/test.py

test.py

#!D:\Python27\python.exe

print 'Content-type: text/html'

print #Prints an empty line, to end the headers

print 'Hello, world2222!'

注意 print 'Content-type: text/html' 后面必须有两个空行,后面才是主程序。所以上面示例的代码后面的空print 是必须的。否则报错。

http://soige.blog.51cto.com/512568/325409

使用CGITB调试

#!D:\Python27\python.exe

importcgitb

cgitb.enable()print 'COntent-type: text/html'

print

print 1/0print 'Hello,Python'

注意,开发完成后需要关掉 cgitb 功能,因为回溯也不是为程序的一般用户准备的。

使用cgi模块

html表单提供给CGI脚本的键-值对,或称为字段,使用FieldStorage类从CGI脚本中获取这些字段。当创建FieldStorage实例时(应该只创建一个),它会从请求中获取输入变量,然后通过类字典接口将它们提供给程序。

如果真的请求中包括名为name的值不应该这样做

form =cgi.FieldStorage()

name= form['name']

应该这样

form =cgi.FieldStorage()

name= form['name'].value

还可以这样

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

示例

#!D:\Python27\python.exe

importcgi, cgitb

cgitb.enable()

form=cgi.FieldStorage()

name= form.getvalue('name', 'Python')print 'Content-type: text/html'

print

print 'Hello,%s!' % name

调用示例 http://localhost/cgi-bin/test.py?name=Java&age=12

>>> importurllib>>> urllib.urlencode({'name':'c++','age':'23'}

... )'age=23&name=c%2B%2B'

带有问候的HTML表单脚本

#!D:\Python27\python.exe

importcgi, cgitb

cgitb.enable()

form=cgi.FieldStorage()

name= form.getvalue('name', 'Python')print 'Content-type: text/html'

print

print '''

Greeting Page

Hello,%s!

Change name

''' % name

这里的test.py 也可以是 test.cgi

mod_python

mod_python是Apache网络服务器的扩展,可以让Python解释器直接成为Apache的一部分。在Python中编写Apache处理程序的功能,和使用C语言不通,它是标准的。使用mod_python处理程序框架可以访问丰富的API,深入Apache内核。、

CGI处理程序,允许使用mod_python解释器运行CGI脚本,执行速度会有相当大的提高

PSP处理程序,运行使用HTML以及Python代码混合编程创建可创建可执行网页,或者Python服务器页面

发布处理程序,允许使用url调用python函数。

相关文档

http://bbs.chinaunix.net/thread-1198737-1-1.html

http://www.361way.com/mod_python/631.html

http://hzcsky.blog.51cto.com/1560073/1188249

官网介绍 https://github.com/grisha/mod_python

CGI处理程序

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

使用CGI处理程序而不使用普通CGI的主要原因性能。根据mod_python文档中的简单测试,至少能将程序的性能提升一个数量级。使用发布处理程序比这个还要快,用自己编写的处理程序甚至会更快,可能会达到CGI处理程序速度的3倍。

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

SetHandler mod_python

PythonHandler mod_python.cgihandler

确保Apache的全局配置中没有冲突的定义,因为.htaccess文件并不会进行覆盖。

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

PSP(Python Server Page,Python服务器页面)

它实际上就类似PHP、ASP。PSP文档是HTML以及Python代码的混合,Python代码会包括具有特殊用途的标签中。任何HTML会被转换为输出函数。

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

AddHandler mod_python .psp

PythonHandler mod_python .psp

这样服务器会把扩展名为.psp文件看做PSP文件。

在开发PSP页面时,使用PythonDebug On指令,会在PSP页面中的任何错误都会导致异常回溯,其中也包括用户源代码。如果让用户通过错误信息看到代码,可能并没有帮助,而且可能会有安全风险。

PSP标签有两类:一类用于语句,另一类用于表达式。表达式标签内的表达式的值会直接放在输出文档中。

adjectives=['beautiful', 'cruel']

%>

Hello

Hello, world.My name is Mr. Gumby

普通输出、语句和表达式可以随意混合。可以书写注释。

网络程序框架

Albatross、Cherrpy、Diango、Plone、Pylons、Quixote、Spyce、TurboGears、web.py、Webware、Zope

Web服务

XML-RPC、SOAP

pythonrestapicctv_Python Web服务(15) 持续更新相关推荐

  1. Web服务不停机更新和灰度发布方案

    文章目录 Web服务不停机更新和灰度发布方案 当前情况 方案一 负载均衡: 问题: 方案二 灰度发布: 用IF指令实现 根据来源ip做判断 根据cookie做判断 使用lua写脚本实现 使用nginx ...

  2. CTF论剑场web题目(持续更新)--WEB2

    web2 题目让在三秒内计算,首先试了试能不能前段绕过,发现不行,抓包也没有什么有用的信息,那就只能上脚本了,刚好,作为萌新的我,不会写脚本那就只能感谢大佬的脚本了: 脚本转自:https://www ...

  3. 2019最新Web前端经典面试试题及答案,持续更新

    Ps: 文章所述内容,来源渠道平时积累以及网上摘录.按日期持续更新...目录: 转载请注明来源. -2018/6/8   1.position的定位方式 2.描述下从输入URL到整个网页加载完毕及显示 ...

  4. 面试1:Java、微服务、架构常见面试题(持续更新中)

    Java.微服务.架构常见面试题(持续更新中) 文章目录 Java.微服务.架构常见面试题(持续更新中) ==**Java**== 1.Java概述 (1)JVM.JRE和JDK (2)Java特点 ...

  5. 基于oAuth2.0开发属于自己的SSO授权服务 - 授权码(Authourization Code)模式 (持续更新中。。。)

    此文章篇幅较长,平日上班较少时间写作,请见谅.持续更新中... oAuth2.0系列文章目录 #mermaid-svg-AZMPq56OmFj1I7k0 {font-family:"treb ...

  6. 微服务基础知识点学习笔记(持续更新)

    微服务基础知识点学习笔记(持续更新) Conrtoller层 整体包括:HTTP协议,JavaWeb三大组件(filter.servlet.listener).SpringMVC(SpringMVC的 ...

  7. web安全从基础术语、windows/linux基础到安全漏洞/病毒木马挖掘与分析利用(持续更新)

    web安全知识从基础术语.windows/linux基础到安全漏洞/病毒木马挖掘与分析利用(持续更新) 专业术语 web环境搭建 windows基础 linux基础 linux系统命令 linux命令 ...

  8. Web安全—脚本木马工作原理(持续更新)

    Web安全-脚本木马工作原理(持续更新) Webshell分类: 一句话木马 大马 小马 打包马 脱裤马 拿到网站Webshell意义(Webshell的权限取决于Web容器运行的权限,通常为网络服务 ...

  9. Web安全工具—Nmap(持续更新)

    Web安全工具-Nmap 简介:Nmap是一款非常强大的端口,主机探测工具,是用来探测计算机网络上主机和服务的一种安全扫描器,nmap会发送特制的数据包到目标主机,然后根据响应数据包进行分析来判断扫描 ...

  10. 15个 Cocos Creator 技术解决方案免费开源!更多资源持续更新中…

    期望的游戏效果不知该如何实现?被繁琐的操作劝退?想要提升开发效率?应广大开发者的需求,Cocos 技术支持团队将持续为大家整理提供一些实用的技术解决方案,通通免费开源! 这些方案部分来自 Cocos ...

最新文章

  1. ICLR2020放榜 34篇满分论文! 48篇orals,108篇spotlights,531篇poster
  2. 企业级java springboot b2bc商城系统开源源码二次开发-(四)断路器(Hystrix)
  3. 解决Fedora 自己编译的内核不能运行Virtualbox的问题。
  4. [软件工程] 查找二维数组最大子数组的之和 郭莉莉李亚文
  5. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】
  6. 关于App开发:模拟服务器数据接口 - MockApi
  7. Oracle修改字段的顺序
  8. 用云原生的思维践行云原生,华为云深耕数字化,一切皆服务
  9. 二分法求数组最大最小_JavaScript之如何求数组的最大值和最小值
  10. 关于Excel中的【照相机】功能。(我们通过此功能,可以通过Excel在图片上面画上一些内容后,连同图片和内容一起弄出来)
  11. 软件需求最佳实践笔记(一)
  12. In-App Purchase 实战
  13. 中国城市经纬度表(精确到县区)Google地图用
  14. wbe下载Excel文件Response响应头格式
  15. ffmpeg从视频文件中提取音频数据
  16. 英语不好学计算机特长,指导:英语学不好,是因为你没养成这些好习惯
  17. 嗯,春招两次腾讯面试都挂二面了,分享下我失败+傻傻的面试经历
  18. 痛并快乐着的保研经历
  19. python心率检测
  20. SATA、AHCI、ATA等相关知识概述(基本概念)

热门文章

  1. Centos7模板机制作
  2. 03-数据解析_xpath(04 【实战】豆瓣电影、电影天堂爬虫)
  3. android+apk编译器,APK编辑器
  4. 使用WebSocket实现多人实时聊天
  5. 计算机无线网络连接怎么弄,如何在台式电脑上设置无线网络连接????
  6. 汪华:未来三年的移动互联网创业
  7. 小象大数据全套视频教程
  8. mysql 设置平均值小数位数_mysql小数位数设置
  9. 好斌c语言教程,C语言学习大纲__斌(讲解).doc.doc
  10. 关于ICP和EDI许可证,你了解多少?