首先,Python提供了HTMLParser来非常方便地解析HTML,只需简单几行代码,如下:
from HTMLParser import HTMLParser
from htmlentitydefs import name2codepoint
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print('<%s>' % tag)
def handle_endtag(self, tag):
print('</%s>' % tag)
def handle_startendtag(self, tag, attrs):
print('<%s/>' % tag)
def handle_data(self, data):
print('data')
def handle_comment(self, data):
print('<!-- -->')
def handle_entityref(self, name):
print('&%s;' % name)
def handle_charref(self, name):
print('&#%s;' % name)
parser = MyHTMLParser()
parser.feed('<html><head></head><body><p>Some <a href=\"#\">html</a> tutorial...<br>END</p></body></html>')
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
都转为小写。
HTMLParser获取标签内容
- 解析时碰到
<***>
,自动调用handle_starttag()
;碰到</***>
,自动调用handle_endtag()
-
每一个标签,无论
<>
还是</>
,均会调用handle_data()
import urllib #urllib提供了一系列用于操作URL的功能。
from HTMLParser import HTMLParser
class PyEventParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self._count = 0 #初始化会议的个数为0
self._events = dict() #会议数据初始化为一个空字典
self._flag = None #初始化标签为空
def handle_starttag(self, tag, attrs):#通过开始标签获取会议的标题,时间,地点
if tag=='h3' and attrs.__contains__(('class','event-title')):#会议标题的html标签为<h3,属性值中包含 class="event-title"
self._count+=1
self._events[self._count]=dict()
self._flag='event-title'
if tag=='time':#会议时间的html标签为<time self._flag='time'
self._flag='time'
if tag=='span' and attrs.__contains__(('class','event-location')):#会议地点标签为<span,属性包含class="event-location"
self._flag='event-location'
def handle_data(self, data):#根据标签获取数据
if self._flag=='event-title':
self._events[self._count][self._flag]=data
if self._flag=='time':
self._events[self._count][self._flag]=data
if self._flag=='event-location':
self._events[self._count][self._flag]=data
self._flag=None
def event_list(self):
print '近期关于python的会议有:',self._count,'个,具体如下:'
#print self._events.values()#打印会议的全部信息
for event in self._events.values():
print event['event-title'],'\t',event['time'],'\t',event['event-location']
parser=PyEventParser()
pypage=urllib.urlopen('https://www.python.org/events/python-events/')#打开爬取网页地址
pyhtml=pypage.read()#获取网页源码
parser.feed(pyhtml)#解析html
parser.event_list()#打印会议信息
parser.close()
运行结果:
近期关于python的会议有: 8 个,具体如下:
DjangoCon Europe 2018 23 May Heidelberg, Germany
PyCon APAC 2018 31 May NUS School of Computing / COM1, 13 Computing Drive, Singapore 117417, Singapore
PyConTW 2018 01 June Taipei, Taiwan
PyCon CZ 2018 01 June Prague, Czech Republic
PyLondinium 08 June London, UK
PyCon Thailand 2018 16 June Thon Buri, Bangkok, Thailand
PyCon US 2018 09 May Cleveland, Ohio, USA
GeoPython 2018 07 May Basel, Switzerland