從百度MP3搜尋結果中提取歌曲列表

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.