本文共 3164 字,大约阅读时间需要 10 分钟。
1.使用HTMLParser从百度MP3搜索结果中提取歌曲列表 """ 从百度MP3搜索结果中提取歌曲列表 方法是:使用数据结构---栈和级别来实现 1.将没有经过的tag全部入栈,经过的全部出栈 2.HTML语法错误处理使用级别来实现,栈顶的tag级别最低,如果高级别的tag要出栈,它会先将低级别的tag先出栈,这样可以避免遗漏的错误 3.对于错误的处理,先查找是否在栈内,如果没有则直接舍弃. 4.每次新的tag入栈,将data清空 5.针对特定的网页进行分析,百度MP3列表比较简单,使用歌曲列表的ID即可. 6.注意:attr = value使用时,value应使用"",否则python报错"junk characters in start tag" """ from HTMLParser import HTMLParser from htmlentitydefs import * import sys,re class SongsParser(HTMLParser): def __init__(self): # 记录没有遇到/tag>的tag self.taglevels = [] # 需要处理的tags self.handledtags = ["table","th","td","tr"] # 当前正在处理的tag self.processing = None self.songs = 0 HTMLParser.__init__(self) def handle_starttag(self,tag,attrs): if len(self.taglevels) and self.taglevels[-1] == tag: """前一个tag与当前的tag相同,则认为是unbalance tag,进行处理""" self.handle_endtag(tag) # 将当前的tag入栈(1) self.taglevels.append(tag) """百度搜索结果歌曲以表格的形式显示,这个表格的ID为"Tbs",处理时只对此表格的内容处理,其他的表格数据忽略""" if tag == "table": for item in attrs: if item[0] == "id" and item[1] == "Tbs": self.songs = 1 # 如果当前的tag需要处理,先清空data,并将tag设置为当前处理(4) if tag in self.handledtags: self.data = "" self.processing = tag def handle_data(self,data): """如果是需要处理的tag,直接将其追加""" if self.processing: self.data += data def handle_endtag(self,tag): if not tag in self.taglevels: """如果tag不在栈中,认为此tag为一非法,不予处理(3)""" return while len(self.taglevels): # 取得栈顶tag starttag = self.taglevels.pop() # 如果是要处理的tag,调用处理函数 if starttag in self.handledtags: self.finishprocessing(starttag) # 如果此tag与starttag相同表示,这个level的tag完成处理,停止循环;否则继续, # 直到此级别一下的tag全部处理(2) if starttag == tag: break def cleanse(self): """删除多余的空格""" self.data = re.sub("/s+"," ",self.data) def finishprocessing(self,tag): self.cleanse() if tag == "title" and tag == self.processing: print "Title = ",self.data elif tag == "tr" and self.songs == 1: print("") elif tag == "td" and tag == self.processing and self.songs == 1: sys.stdout.write("/t" + self.data) elif tag == "table": """歌曲表格中没有内嵌的表格,所以可以看到是就将songs置为0,歌曲列表已经完成""" self.songs = 0 self.processing = None fd = open("JCParseHtmlSongs.htm") tp = SongsParser() tp.feed(fd.read()) fd.close() 2.输出结果 1 彩虹 第二主打 周杰伦 我很忙 试听 歌词 4.0 M wma 2 彩虹 OS版 zoelee bbs jayfc com 周杰伦 我很忙 试听 歌词 6.1 M mp3 3 彩虹 OS版 zoelee bbs jayfc com 周杰伦 我很忙 试听 歌词 6.1 M mp3 4 彩虹 周杰伦 我很忙 试听 歌词 3.1 M mp3 5 彩虹 第二主打 周杰伦 我很忙 试听 歌词 3.5 M wma 6 彩虹 JayCn 王贝 周杰伦 我很忙 试听 歌词 6.1 M mp3 7 彩虹 OS版 zoelee bbs jayfc com 周杰伦 我很忙 试听 歌词 6.1 M mp3 8 彩虹 周杰伦 我很忙 试听 歌词 0.4 M mp3 9 彩虹 QQ:8058722 周杰伦 我很忙 试听 歌词 1.3 M mp3 10 彩虹 第二主打 周杰伦 我很忙 试听 歌词 0.3 M wma 11 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 12 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 13 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 未知 wma 14 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 15 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 未知 wma 16 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 17 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 18 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 未知 wma 19 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 20 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 21 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 22 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 23 彩虹 杰伦部落 JayHome Cn 周杰伦 我很忙 试听 歌词 1.8 M mp3 24 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 25 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 未知 wma 26 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 未知 wma 27 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 28 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 0.2 M mp3 29 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 未知 wma 30 情画 周杰伦 刘畊宏 彩虹天堂 试听 歌词 未知 wma转载地址:http://edqbi.baihongyu.com/