1. 程式人生 > >Python解析Python官網會議安排

Python解析Python官網會議安排

HTMLParser是python用來解析html的模組,它可以分析出html裡面的標籤、資料等。

HTMLParser採用的是一種事件驅動的模式,當HTMLParser找到一個特定的標記時,它會去呼叫一個使用者定義的函式,以此來通知程式處理。它主要的使用者回撥函式的命名都是以handler_開頭的,都是HTMLParser的成員函式。

handle_startendtag  處理開始標籤和結束標籤 
handle_starttag     處理開始標籤,比如<xx> 
handle_endtag       處理結束標籤,比如</xx> 
handle_charref      處理特殊字串,就是以&#開頭的,一般是內碼錶示的字元 
handle_entityref    處理一些特殊字元,以&開頭的,比如   
handle_data         處理資料,就是<xx>data</xx>中間的那些資料 
handle_comment      處理註釋 
handle_decl         處理<!開頭的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” 
handle_pi           處理形如<?instruction>的東西 

舉例:

#!usr/bin/env python3
# -*- coding:utf-8 -*-

from html.parser import HTMLParser
from html.entities import name2codepoint

class MyHTMLParser2(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.flag=None
    def handle_starttag(self,tag,attrs):
        if tag=='h3' and attrs.__contains__(('class','event-title')):
            print('\n\n會議主題:',end='')
            self.flag=True    #在需要列印的塊中設定標識
        elif tag=='time':
            print('\n會議時間:',end='')
            self.flag=True
        elif tag=='span' and attrs.__contains__(('class','event-location')):
            print('\n會議地址:',end='')
            self.flag=True
			
    def handle_endtag(self,tag):
        if tag in('h3','time','span'):
            self.flag=None
            #print('</%s>' % tag)
			
    def handle_startendtag(self,tag,attrs):
        #print('<%s/>' % tag)
        pass
    def handle_data(self,data):
        #print('----------->%s'%data.strip())
        if self.flag:    #判斷是需要的值才打印
            print('%s' % data,end='')   #末尾不換行
		
    def hangle_comment(self,data):
        #print('<!--  -->')
        pass
	
    def handle_entityref(self,name):
        #print('====>%s' % name)
        if name=='ndash':
            print('至',end='')
        else:
            pass
    def handle_charref(self,name):
        #print('&#%s;' % name)
        pass


with open('python_meeting.xml','rb') as f:
    s=f.read()
parser=MyHTMLParser2()
parser.feed(str(s))
會議主題:PyCon Ghana 2018
會議時間:10 Aug. \xe2\x80\x93 12 Aug.  2018
會議地址:Accra, Ghana

會議主題:PyData Delhi 2018
會議時間:11 Aug. \xe2\x80\x93 13 Aug.  2018
會議地址:New Delhi, India

會議主題:PyCon Korea 2018
會議時間:15 Aug. \xe2\x80\x93 20 Aug.  2018
會議地址:Seoul, South Korea

會議主題:PyBay 2018
會議時間:16 Aug. \xe2\x80\x93 20 Aug.  2018
會議地址:San Francisco, CA, USA

會議主題:PyCon PL 2018
會議時間:23 Aug. \xe2\x80\x93 27 Aug.  2018
會議地址:Ossa, Poland

會議主題:Flask Conference
會議時間:24 Aug. \xe2\x80\x93 26 Aug.  2018
會議地址:S\xc3\xa3o Paulo, Brazil