【Python入门】常用自带模块之HTMLParser

学习python的第7天

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

如一个标签为:

那么其attrs列表为:

[(‘type’, ‘hidden’), (‘name’, ‘NXX’), (‘id’, ‘IDXX’), (‘value’, ‘VXX’)]
  • HTMLParser自动将tagattrs都转为小写。

2.获取标签内容

解析时碰到<***>,自动调用handle_starttag();碰到,自动调用handle_endtag()
每一个标签,无论<> 还是,均会调用handle_data()

html中第一行、第二行分别为和,后面无具体数据,只有回车换行,所以调用handle_data(),打印结果为换行;同理。

3.一个简单的例子

获取豆瓣上正在上映影片的基本信息

# encoding=utf8
from urllib import request
import urllib
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):
        #此处得到的attrs即为根据tags解析出来的list,形式为[('属性1','值1'),('属性2','值2'),('属性3','值3')]
        def _attr(attrlist, attrname):
            #此函数用于后续通过查找某一属性来确定要找的标签
            for each in attrlist:
                if attrname == each[0]:
                    return each[1]
            return None

        if tag == 'li' and _attr(attrs, 'data-actors'):
            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)


parser = Myparser()
url = 'https://movie.douban.com/'

if __name__ == '__main__':
    with urllib.request.urlopen(url) as f:
        data = f.read()#将url中内容全部读取出来
        parser.feed(data.decode('utf-8'))#将读取出来的内容解析
        for each in parser.movies:
            print('%(title)s|%(rate)s|%(actors)s|%(director)s|%(duration)s' % each)

结果如下:

runfile('D:/codes/python/20190226/test_douban.py', wdir='D:/codes/python/20190226')
阿丽塔:战斗天使 Alita: Battle Angel|7.6|罗莎·萨拉查 / 克里斯托弗·沃尔兹 / 基恩·约翰逊|罗伯特·罗德里格兹|None
三变山变|||彭兰玉|None
流浪地球|7.9|屈楚萧 / 吴京 / 李光洁|郭帆|None
飞驰人生|7.0|沈腾 / 黄景瑜 / 尹正|韩寒|None
疯狂的外星人|6.4|黄渤 / 沈腾 / 汤姆·派福瑞|宁浩|None
朝花夕誓 さよならの朝に約束の花をかざろう|7.0|石见舞菜香 / 入野自由 / 茅野爱衣|冈田磨里|None
一吻定情|5.3|王大陆 / 林允 / 陈柏融|陈玉珊|None
新喜剧之王|5.8|王宝强 / 鄂靖文 / 张全蛋|周星驰|None
熊出没·原始时代|6.5|张伟 / 张秉君 / 谭笑|丁亮|None
廉政风云 廉政風雲 煙幕|5.5|刘青云 / 张家辉 / 林嘉欣|麦兆辉|None
神探蒲松龄|4.1|成龙 / 阮经天 / 钟楚曦|严嘉|None
古井凶灵||程韦然 / 陈美林 / 李易芸|王辰六|None
今夜在浪漫剧场 今夜、ロマンス劇場で|7.2|绫濑遥 / 坂口健太郎 / 本田翼|武内英树|None
小猪佩奇过大年|4.0|朱亚文 / 刘芸 / 归亚蕾|张大鹏|None
白蛇:缘起|8.0|张喆 / 杨天翔 / 唐小喜|黄家康|None
大黄蜂 Bumblebee|7.1|海莉·斯坦菲尔德 / 小豪尔赫·兰登伯格 / 约翰·塞纳|特拉维斯·奈特|None
燃点|6.3|罗永浩 / 戴威 / 张颖|关琇|None
五十米之恋||谢楠 / 方力申 / 仇佩佩|李依理|None

 

你可能感兴趣的:(【Python入门】常用自带模块之HTMLParser)