python学习——正则表达项目

主要实现功能

从网页爬取关键信息,展示在自己写的界面上。
从http://www.5ppt.net/aricle.asp?id=3947&p=1,获取各个国家的疫情信息。

实现思路

  1. 使用request库,调用request.get(),爬取网页内容
  2. 使用re库,使用正则表达式,在网页内容中各个国家的疫情人数,存在一个列表中。
  3. 使用PyQt5库,构建一个包含进度条,按钮,标签的界面,展示获得的数据。

实现步骤

一、构造函数

构建界面,所以定义一个类,在构造函数中,声明需要调用的函数和属性。
界面需要多个进度条和标签,所以得列表形式
需要爬取网页信息的方法
需要生成界面的方法
网页信息存储在self中,所以在声明一个存网页信息的列表
写程序经验:需要多次传递的写在self中,最好事先在构造函数中声明。

class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.pbar = [] #界面进度条
        self.lab = [] #界面标签
        self.infos = [] #爬取信息
        self.epidemic() #执行爬虫任务
        self.initUI() #执行生成界面

二、爬虫函数

从网页中爬取信息,这种信息一定是有特点的信息,比如这个网页中各个国家新冠人数的信息
在网页上显示是:
在这里插入图片描述
右击打开网页源码,显示是:
在这里插入图片描述
可以看到关键信息都有固定模式,汉字+冒号+数字+例,只要符合这个类型的,都匹配出来,存在self.infos中。
用两个()分别括住国家信息和人数信息,在正则结果中用列表的下标可以快速得到想要的信息。
注意要点:

  1. 这个网页一共有5页,通过网址最后的‘3947&p=几’来分开,比如‘3947&p=2’打开就是第二页,所以需要匹配五次,分别对5个不同的网址。
  2. 需要改变网页的编码方式,通常为‘UTF-8’,也可以写成r.encoding = r.apparent_encoding,汉字不会变为乱码。
  3. 匹配结果是列表,包含两个元素的列表,需要把他添加到self.infos中。
    def epidemic(self):
        url = "http://www.5ppt.net/aricle.asp?id=3947&p="
        for i in range(1,5):
            url_new = url+str(i)
            r = requests.get(url_new)
            if r.status_code == 200:
                r.encoding = r.apparent_encoding#改变编码方式
                result = re.findall('([\u4e00-\u9fa5]+):(\d+)例',r.text)#‘[\u4e00-\u9fa5]’匹配中文的意思
                #正则表达加()分组,变为列表,便于后续处理
                if result != []:
                    for one_info in result:
                        self.infos.append(one_info)
        print(self.infos)

界面函数

for循环得到进度条列表和标签列表,相对简单
注意要点:

  1. 把进度条和标签对象,一个一个添加到对应的列表中
  2. 单独创建一个按钮对象,并且需要间接点击触发的事件。
  3. 各个控件的位置需要调试放在合适的位置。
    def initUI(self):
        for i in range(len(self.infos)):
            self.pbar.append(QProgressBar(self))
            self.lab.append(QLabel(self))
            self.pbar[i].setGeometry(120,80+30*i,200,25)
            self.lab[i].setGeometry(50,80+30*i,60,30)
            self.lab[i].setText(str(i))
            self.pbar[i].setValue(0)

        self.btn = QPushButton('显示数据',self)
        self.btn.move(120,20)
        self.btn.clicked.connect(self.doAction)
        self.setGeometry(600,100,380,800)
        self.setWindowTitle('进度条')
        self.show()

项目入口

注意判断if name == ‘main’:,再开始执行主函数。

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值