python 解析html代码,获取所需数据

from html.parser import HTMLParser
from html.entities import name2codepoint
from urllib import request
import re


class MyHTML(HTMLParser):

    def init(self):
        self.__parsedata = ''  # 设置一个空状态
        self.bj = '';
    def handle_starttag(self, tag, attrs):
        if ('class', 'event-title') in attrs:#获取class=event-title的属性名称
            self.__parsedata = 'name'  # 设置爬取名称状态
        if tag == 'time':
            self.__parsedata = 'time'
        if ('class', 'say-no-more') in attrs:
            self.__parsedata = 'year'
        if ('class', 'event-location') in attrs:
            self.__parsedata = 'location'
        if('title','More Events') in attrs:
            for k,v in attrs:
                if k == 'href':
                   self.bj = re.findall(r'\d',v)[0]#获取分页数据


    def handle_endtag(self, tag):
        if tag == 'h3' or tag == 'span':#获取数据结束标记
            self.__parsedata = ''

    def handle_startendtag(self, tag, attrs):
            '''print('<%s/>' % tag)'''
           #tag:类似于这种<a/>,一个标签中含有结束符号

    def handle_data(self, data):
        with open('mytext.txt', 'a+') as f:#将内容写入mytext.txt文件中,a+不断往文件里面添加,不会覆盖原内容
            if self.__parsedata == 'name':
                print('会议名称:%s' % data)
                f.write(data+'\n')

            if self.__parsedata == 'time':
                print('会议时间:%s' % data)
                f.write(data + '\n')
            if self.__parsedata == 'year':
                if re.match(r'\s\d{4}', data):
                    # 因为后面还有两组 say-no-more 后面的data却不是年份信息,所以用正则检测一下
                    print('会议年份:%s' % data.strip())
                    f.write(data.strip() + '\n')
            if self.__parsedata == 'location':
                print('会议地点:%s' % data)
                f.write(data + '\n\n')
            f.close()

    def handle_comment(self, data):
        '''print('<!--', data, '-->')'''

    def handle_entityref(self, name):
        '''print('&%s;' % name)'''

    def handle_charref(self, name):

       '''print('&#%s;' % name)'''

parser = MyHTML()
parser.init()
flag = ''#退出查询标记
while True:
    if parser.bj == '':
        with request.urlopen('https://www.python.org/events/python-events/') as f:
            data = f.read()
            req = data.decode('utf-8')
            parser.feed(req)
    else:
        if flag != parser.bj:
            with request.urlopen('https://www.python.org/events/python-events/?page='+parser.bj) as f:
                flag = parser.bj
                data = f.read()
                req = data.decode('utf-8')
                parser.feed(req)

        else:
            exit()



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值