python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、Beau
一、利用HTMLParser进行网页解析 1、从一个简单的解析例子开始 复制代码 代码如下: <html> <head> <title> XHTML 与 HTML 4.01 标准没有太多的不同</title> </head> <body> i love you </body> </html> 下面是能够列出title和body的程序示例: 复制代码 代码如下: ##@小五义: ##HTMLParser示例 import HTMLParser class TitleParser(HTMLParser.HTMLParser): def __init__(self): self.taglevels=[] self.handledtags=['title','body'] #提出标签 self.processing=None HTMLParser.HTMLParser.__init__(self) def handle_starttag(self,tag,attrs): if tag in self.handledtags: self.data='' self.processing=tag def handle_data(self,data): if self.processing: self.data +=data def handle_endtag(self,tag): if tag==self.processing: print str(tag)+':'+str(tp.gettitle()) self.processing=None def gettitle(self): return self.data fd=open('test1.html') tp=TitleParser() tp.feed(fd.read()) 运行结果如下: 2、解决html实体问题 复制代码 代码如下: <html> <head> <title> XHTML 与" HTML 4.01 "标准没有太多的不同</title> </head> <body> i love you× </body> </html> 利用上面的例子进行分析,其结果是: 复制代码 代码如下: ##@小五义: ##HTMLParser示例:解决实体问题 from htmlentitydefs import entitydefs import HTMLParser class TitleParser(HTMLParser.HTMLParser): def __init__(self): self.taglevels=[] self.handledtags=['title','body'] self.processing=None HTMLParser.HTMLParser.__init__(self) def handle_starttag(self,tag): if tag==self.processing: print str(tag)+':'+str(tp.gettitle()) self.processing=None def handle_entityref(self,name): if entitydefs.has_key(name): self.handle_data(entitydefs[name]) else: self.handle_data('&'+name+';') def gettitle(self): return self.data fd=open('test1.html') tp=TitleParser() tp.feed(fd.read()) 运行结果为: (2)实体编码 复制代码 代码如下: <html> <head> <title> XHTML 与" HTML 4.01 "标准没有太多的不同</title> </head> <body> i love÷ you× </body> </html> 如果利用例2的代码执行后结果为: 复制代码 代码如下: ##@小五义: ##HTMLParser示例:解决实体问题 from htmlentitydefs import entitydefs import HTMLParser class TitleParser(HTMLParser.HTMLParser): def __init__(self): self.taglevels=[] self.handledtags=['title',name): if entitydefs.has_key(name): self.handle_data(entitydefs[name]) else: self.handle_data('&'+name+';') def handle_charref(self,name): def gettitle(self): 运行结果为: 3、提取链接 复制代码 代码如下: <html> <head> <title> XHTML 与" HTML 4.01 "标准没有太多的不同</title> </head> <body> <a href="http://pypi.python.org/pypi" title="link1">i love÷ you×</a> 这里在handle_starttag(self,attrs)中,tag=a时,attrs记录了属性值,因此只需要将attrs中name=href的value提出即可。具体如下: 复制代码 代码如下: ##@小五义: ##HTMLParser示例:提取链接 # -*- coding: cp936 -*- from htmlentitydefs import entitydefs import HTMLParser class TitleParser(HTMLParser.HTMLParser): def __init__(self): self.taglevels=[] self.handledtags=['title','body'] self.processing=None HTMLParser.HTMLParser.__init__(self) def handle_starttag(self,attrs): if tag in self.handledtags: self.data='' self.processing=tag if tag =='a': for name,value in attrs: if name=='href': print '连接地址:'+value def handle_data(self,name): try: charnum=int(name) except ValueError: return if charnum<1 or charnum>255: return self.handle_data(chr(charnum)) def gettitle(self): 运行结果为: i love÷ you× 4、提取图片 复制代码 代码如下: <html> <head> <title> XHTML 与" HTML 4.01 "标准没有太多的不同</title> </head> <body> i love÷ you× <a href="http://pypi.python.org/pypi" title="link1">我想你</a> <div id="m"><img src="/uploads/201701/11/14841468991.gif" width="270" height="129" ></div> </body> </html> 将baidu_sylogo1.gif存取出来,具体代码如下: 复制代码 代码如下: ##@小五义: ##HTMLParser示例:提取图片 # -*- coding: cp936 -*- from htmlentitydefs import entitydefs import HTMLParser,urllib def getimage(addr):#提取图片并存在当前目录下 u = urllib.urlopen(addr) data = u.read() filename=addr.split('/')[-1] f=open(filename,'wb') f.write(data) f.close() print filename+'已经生成!' class TitleParser(HTMLParser.HTMLParser): def gettitle(self): 运动结果为: 5、实际例子: 复制代码 代码如下: ##@小五义: ##HTMLParser示例:获取人人网首页上的各各链接地址 #coding: utf-8 from htmlentitydefs import entitydefs import HTMLParser,urllib def getimage(addr): u = urllib.urlopen(addr) data = u.read() filename=addr.split('/')[-1] f=open(filename,'wb') f.write(data) f.close() print filename+'已经生成!' class TitleParser(HTMLParser.HTMLParser): def __init__(self): self.taglevels=[] self.handledtags=['a'] self.processing=None self.linkstring='' self.linkaddr='' HTMLParser.HTMLParser.__init__(self) def handle_starttag(self,attrs): if tag in self.handledtags: for name,value in attrs: if name=='href': self.linkaddr=value self.processing=tag def handle_data(self,data): def gettitle(self): 运行结果: 二、利用BeautifulSoup进行网页解析 复制代码 代码如下: <html> <head> <title> XHTML 与" HTML 4.01 "标准没有太多的不同</title> </head> <body> i love÷ you× <a href="http://pypi.python.org/pypi" title="link1">我想你</a> <div id="m"><img src="/uploads/201701/11/14841468991.gif" width="270" height="129" ></div> </body> </html> 获取title的代码: 复制代码 代码如下: ##@小五义: ##BeautifulSoup示例:title #coding: utf8 import BeautifulSoup a=open('test1.html','r')
复制代码 代码如下: ##@小五义: ##BeautifulSoup示例:title #coding: utf8 import BeautifulSoup a=open('test1.html','r') htmlline=a.read() soup=BeautifulSoup.BeautifulStoneSoup(htmlline.decode('gb2312'),convertEntities=BeautifulSoup.BeautifulStoneSoup.ALL_ENTITIES) #print soup.prettify()#规范化html文件 titleTag=soup.html.head.title print titleTag.string 这里convertEntities=BeautifulSoup.BeautifulStoneSoup.ALL_ENTITIES中的ALL_ENTITIES定义了XML和HTML两者的实体代码。当然,也可以直接用XML_ENTITIES或者HTML_ENTITIES。运行结果如下: 复制代码 代码如下: ##@小五义: ##BeautifulSoup示例:提取链接 #coding: utf8 import BeautifulSoup a=open('test1.html','r') htmlline=a.read() a.close() soup=BeautifulSoup.BeautifulStoneSoup(htmlline.decode('gb2312'),convertEntities=BeautifulSoup.BeautifulStoneSoup.ALL_ENTITIES) name=soup.find('a').string links=soup.find('a')['href'] print name+':'+links 运行结果为: 复制代码 代码如下: ##@小五义:http://www.cnblogs.com/xiaowuyi #coding: utf8 import BeautifulSoup,'wb') f.write(data) f.close() print filename+' finished!' a=open('test1.html',convertEntities=BeautifulSoup.BeautifulStoneSoup.ALL_ENTITIES) links=soup.find('img')['src'] getimage(links) 提取链接和提取图片两部分主要都是用了find方法,具体方法为: 复制代码 代码如下: ##@小五义: ##BeautifulSoup示例:获取人人网首页上的各各链接地址 #coding: utf8 import BeautifulSoup,urllib linkname='' htmlline=urllib.urlopen('http://www.renren.com/').read() soup=BeautifulSoup.BeautifulStoneSoup(htmlline.decode('utf-8')) links=soup.findAll('a') for i in links: ##判断tag是a的里面,href是否存在。 if 'href' in str(i): linkname=i.string linkaddr=i['href'] if 'NoneType' in str(type(linkname)):#当i无内容是linkname为Nonetype类型。 print linkaddr else: print linkname+':'+linkaddr 运行结果: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Python xlrd读为字符串
- python – 设置django rest框架配置的DatetimeField格式
- python-requests – Python请求:[SSL:CERTIFICATE_VERIFY
- python – 使用djangos`manage.py shell`时禁用Sentry报告
- Python:当我有一个if语句和一个分配给3个整数的打印件时,我
- Python:Scrapy框架中Item Pipeline组件使用详解
- python – AttributeError:模块’attr’没有属性’s’
- Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
- python操作sqlite
- python获取android设备的GPS信息脚本分享