Python的自带模块——HTMLParser的初步学习

来源:互联网 发布:发淘宝链接如何粘贴 编辑:程序博客网 时间:2024/05/21 12:42

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=utf8import requestsfrom html.parser import HTMLParserfrom html.entities import name2codepointclass 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.moviesif __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|白歆惠 / 李昌熙 / 罗家英|殷国君|NoneT台魔王||朱研 / 班嘉佳 / 侯静文|牛辉|None我是哪吒|4.9|陶典 / 韩娇娇 / 刘垚|舒展|None神兽金刚之青龙再现|5.5|黄健 / 李仲鑫 / 谢安晟|朱晓兵|None疯狂丑小鸭|2.8|苏倩芸 / 王雪沁 / 杨进|蒋叶峰|None樱桃小丸子:来自意大利的少年 ちびまる子ちゃん イタリアから来た少年|7.1|鳕子 / 屋良有作 / 一龙斋贞友|高木淳|None新东方神娃||王燕华 / 王晓彤 / 李晔|殷晓东|None七月与安生|7.6|周冬雨 / 马思纯 / 李程彬|曾国祥|None爱上处女座|4.1|萧蔷 / 贺刚 / 高天|刘观伟|NoneProcess finished with exit code 0
1 0
原创粉丝点击