博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从百度MP3搜索结果中提取歌曲列表
阅读量:4029 次
发布时间:2019-05-24

本文共 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/

你可能感兴趣的文章
No.182 - LeetCode1325 - C指针的魅力
查看>>
mac:移动python包路径
查看>>
mysql:sql create database新建utf8mb4 数据库
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql alter table 修改列属性的字符集
查看>>
mysql:sql drop table (删除表)
查看>>
mysql:sql truncate (清除表数据)
查看>>
scrapy:xpath string(.)非常注意问题
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>
单纯的把Y通道提取出来能正确显示出灰度图来为什么我的Qt就显示不出来呢转换有问题呀?
查看>>
YUV420只绘制Y通道
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
qt5 everywhere编译完成后,找不到qmake
查看>>
arm-linux开机读取硬件时钟,设置系统时钟。
查看>>
交叉编译在x86上调试好的qt程序
查看>>