学习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
如一个标签为:
<input type="hidden" name="NXX" id="IDXX" value="VXX" />
那么其attrs列表为:
[(‘type’, ‘hidden’), (‘name’, ‘NXX’), (‘id’, ‘IDXX’), (‘value’, ‘VXX’)]
HTMLParser
自动将tag
和attrs
都转为小写。
2.获取标签内容
解析时碰到<***>,自动调用handle_starttag();碰到</***>,自动调用handle_endtag()
每一个标签,无论<> 还是</>,均会调用handle_data()
html中第一行、第二行分别为<html>和<head>,后面无具体数据,只有回车换行,所以调用handle_data(),打印结果为换行;</html></head>同理。
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