Python的自帶模塊——HTMLParser的初步學習

Python的自帶模塊——HTMLParser的初步學習

  • HTMLParser是Python自帶的模塊,使用簡單,能夠很容易的實現HTML文件的分析。
  • 本文主要簡單講一下HTMLParser的用法.

  • 使用時需要定義一個從模塊html.parser中的類HTMLParser繼承的類,重定義函數:

    • handle_starttag( tag, attrs)
    • handle_startendtag( tag, attrs)
    • handle_endtag( tag)
    • handle_data(data)

1. 獲取標籤屬性

  • tag是的html標籤,attrs是 (屬性,值)元組(tuple)的列表(list).

如一個標籤爲:

<input type="hidden" name="NXX" id="IDXX" value="VXX" />

那麼它的attrs列表爲

`[(‘type’, ‘hidden’), (‘name’, ‘NXX’), (‘id’, ‘IDXX’), (‘value’, ‘VXX’)]

  • HTMLParser自動將tagattrs都轉爲小寫。

2. 獲取標籤內容

  • 解析時碰到<***>,自動調用handle_starttag();碰到</***>,自動調用handle_endtag()
  • 每一個標籤,無論<> 還是</>,均會調用handle_data()

  • html中第一行、第二行分別爲<html><head>,後面無具體數據,只有回車換行,所用調用handle_data(),打印結果爲換行;</html></head>同理。

3. 一個簡單的例子

  • 獲取豆瓣上正在上映影片的基本信息
# encoding=utf8
import requests
from html.parser import HTMLParser
from html.entities import name2codepoint


class Myparser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.movies = []

    def handle_starttag(self, tag, attrs):
        def _attr(attrlist, attrname):
            for each in attrlist:
                if attrname == each[0]:
                    return each[1]
            return None

        if tag == 'li' and _attr(attrs, 'data-title'):
            movie = {}
            movie['actors'] = _attr(attrs, 'data-actors')
            movie['director'] = _attr(attrs, 'data-director')
            movie['duration'] = _attr(attrs, 'data-dutation')
            movie['title'] = _attr(attrs, 'data-title')
            movie['rate'] = _attr(attrs, 'data-rate')
            self.movies.append(movie)


def movieparser(url):
    headers = {}
    req = requests.get(url)
    s = req.text
    myparser = Myparser()
    myparser.feed(s)
    myparser.close()
    return myparser.movies


if __name__ == '__main__':
    url = 'https://movie.douban.com/'
    movies = movieparser(url)
    for each in movies:
        print('%(title)s|%(rate)s|%(actors)s|%(director)s|%(duration)s' % each)

運行結果:

湄公河行動|8.2|張涵予 / 彭于晏 / 孫淳|林超賢|None
圓夢巨人 The BFG|6.7|魯比·巴恩希爾 / 馬克·裏朗斯 / 比爾·哈德爾|史蒂文·斯皮爾伯格|None
從你的全世界路過|5.5|鄧超 / 白百何 / 楊洋|張一白|None
暗殺遊戲 Мафия: Игра на выживание|4.3|瓦蒂姆·提薩拉提 / 維奧萊塔·吉特孟斯塔雅 / 韋尼亞明·斯梅霍夫|薩里·奧德賽耶|None
魯濱遜漂流記 Robinson Crusoe|5.5|馬提亞斯·施維赫夫 / 卡亞·葉娜爾 / 伊爾卡·貝桑|文森特·凱斯特魯特|None
勇士|4.7|李東學 / 于小偉 / 聶遠|寧海強|None
黑處有什麼|6.8|蘇曉彤 / 郭笑 / 陸琦蔚|王一淳|None
王牌逗王牌|3.6|劉德華 / 黃曉明 / 王祖藍|王晶|None
爵跡|3.7|范冰冰 / 吳亦凡 / 陳學冬|郭敬明|None
鎧甲勇士捕王|4.1|賴藝 / 王暢唱 / 曲澔濬|鄭國偉|None
逗鳥外傳:萌寶滿天飛 Storks|7.7|安迪·薩姆伯格 / 凱蒂·克朗 / 凱爾希·格蘭莫|尼古拉斯·斯托勒|None
賓虛 Ben-Hur|5.8|傑克·休斯頓 / 納贊寧·波妮阿蒂 / 摩根·弗里曼|提莫·貝克曼貝托夫|None
幽靈醫院|2.4|白歆惠 / 李昌熙 / 羅家英|殷國君|None
T臺魔王||朱研 / 班嘉佳 / 侯靜文|牛輝|None
我是哪吒|4.9|陶典 / 韓嬌嬌 / 劉垚|舒展|None
神獸金剛之青龍再現|5.5|黃健 / 李仲鑫 / 謝安晟|朱曉兵|None
瘋狂醜小鴨|2.8|蘇倩芸 / 王雪沁 / 楊進|蔣葉峯|None
櫻桃小丸子:來自意大利的少年 ちびまる子ちゃん イタリアから來た少年|7.1|鱈子 / 屋良有作 / 一龍齋貞友|高木淳|None
新東方神娃||王燕華 / 王曉彤 / 李曄|殷曉東|None
七月與安生|7.6|周冬雨 / 馬思純 / 李程彬|曾國祥|None
愛上處女座|4.1|蕭薔 / 賀剛 / 高天|劉觀偉|None

Process finished with exit code 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章