python爬虫基础-HTMLParser

首先,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自动将tagattrs都转为小写。

    HTMLParser获取标签内容

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

    来看一个简单的案例:用爬虫把python官网的会议页面抓下来,然后解析该HTML页面,获取会议名称,时间和地点
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值