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
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