Python爬虫基础之三

news2024/9/21 14:43:20

Python爬虫基础包括HTTP协议、HTML、CSS和JavaScript语言基础、requests库的使用、Beautiful Soup库的使用、xpath和正则表达式的使用等。此外,还应该了解反爬虫机制和爬虫的一些常见问题及解决方法。

上一篇文章讲解了有关条件判断语句、循环语句、元组、字典等相关知识,本节将围绕代码异常处理以及捕获来实践。

10、异常处理

10.1 异常简介

 print '-----test--1---'  
    open('123.txt','r')  
 print '-----test--2---'

在这里插入图片描述

打开一个不存在的文件123.txt,当找不到123.txt 文件时,就会抛出给我们一个IOError类型的错误,No such file or directory:123.txt (没有123.txt这样的文件或目录)

10.2 捕获异常

try:
     print('-----test--1---')  
    open('123.txt','r')           
    print('-----test--2---')
except IOError:
    pass

此程序看不到任何错误,因为用except 捕获到了IOError异常,并添加了处理的方法
pass 表示实现了相应的实现,但什么也不做;如果把pass改为print语句,那么就会输出其他信息

总结:

在这里插入图片描述

把可能出现问题的代码,放在try中
把处理异常的代码,放在except中

try:
  print num 
except IOError:
  print('产生错误了')

上例程序,已经使用except来捕获异常,但是还会看到错误的信息提示

except捕获的错误类型是IOError,而此时程序产生的异常为 NameError ,所以except没有生效

try:
  print num
except NameError:
  print('产生错误了')

Python的一些內建异常:

| 异常 | 描述 |
| —————– | —————————- |
| Exception | 常规错误的基类 |
| AttributeError | 对象没有这个属性 |
| IOError | 输入/输出操作失败 |
| IndexError | 序列中没有此索引(index) |
| KeyError | 映射中没有这个键 |
| NameError | 未声明/初始化对象 (没有属性) |
| SyntaxError | Python 语法错误 |
| TypeError | 对类型无效的操作 |
| ValueError | 传入无效的参数 |
| ZeroDivisionError | 除(或取模)零 (所有数据类型) |

10.3 捕获多个异常

#coding=utf-8 
try:
 print('-----test--1---')
 open('123.txt','r') # 如果123.txt文件不存在,那么会产生 IOError 异常  
 print('-----test--2---')
 print(num)# 如果num变量没有定义,那么会产生 NameError 异常
 except (IOError,NameError):
 #如果想通过一次except捕获到多个异常可以用一个元组的形式

10.4 获取异常的信息描述

在这里插入图片描述
在这里插入图片描述

10.5 try…finally…

在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等

import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
            time.sleep(2)
            print(content)
    except:
         #如果在读取文件的过程中,产生了异常,那么就会捕获到  
         #比如 按下了 ctrl+c
        pass
    finally:
        f.close()
        print('关闭文件')
except:
    print("没有这个文件")

test.txt文件中每一行数据打印,但是我有意在每打印一行之前用time.sleep方法暂停2秒钟。这样做的原因是让程序运行得慢一些。在程序运行的时候,按Ctrl+c中断(取消)程序。
我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执行,把文件关闭。

11、Python知识

除法
除 /
整除 //
求余 %
商和余数的元组 divmod

移位操作

左移(<<)

a<<n,则a' =a*(2^n),左移 n 位相当于原操作数乘以 2^n,原操作数不发生变化。

>>> 3<<1      # 向右移动一位,相当于是乘以2
6             
>>> -3<<2     # 向右移动一位,相当于是乘以4
-12

右移(>>)

a>>n,则a' =a//(2^n),左移 n 位相当于原操作数整除 2^n,原操作数不发生变化。

>>> 2>>1     # 移动一位,相当于是2//2
1            
>>> 2>>2     # 相当于先左移一位得到1,结果1再除以2等于0
0
>>> 2>>3     # 相当于2//8
0  
          
>>> -8>>2    # 移动2位,相当于-8//4
-2
>>> -8>>3    # 移动3位,相当于是用结果-2再除以2
-1
>>> -8>>4    # 移动4位,相当于是用结果-1再除以2
-1

如果操作数是正数,那么对之不停进行右移操作,最终结果一定可以得到 0;如果操作数是负数,对之不停进行右移操作,最终结果一定可以得到 -1。

匿名函数lambda

匿名函数 lambda 是指一类无需定义标识符(函数名)的函数或子程序。

lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。

语法:

lambda [arg1,arg2,.....argn]:expression

冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式(只能为一个)。其实lambda返回值是一个函数的地址,也就是函数对象。

lambda arg: print("hello,world",arg)

lambda表达式限制只能包含一行代码,但是其实可以利用元组或列表强行让其包含多行。(但是这么做会严重影响可读性,除非万不得已不要使用)

lambda :(
    print("hello"),
    print("world"),           
)

切片

在这里插入图片描述

t=[1,2,3,4,5]

print(t[1:])     取第二个到最后一个元素
结果:[2 3 4 5]

print(t[:])     取所有元素
结果:[1 2 3 4 5]

print(t[1:3])     取t[1]-t[2]
结果:[ 2 3 ]

print(t[:-1])     除了最后一个取全部
结果:[ 1 2 3 4 ]
 
print(t[::-1])     取从后向前(相反)的元素
结果:[ 5 4 3 2 1 ]
 
print(t[2::-1])     取从下标为2的元素翻转读取
结果:[ 3 2 1 ]

字符串方法

join(iterable)

获取可迭代对象(iterable)中的所有项目,并将它们连接为一个字符串。

实例1:

myTuple = ("Bill", "Steve", "Elon")
x = "#".join(myTuple)
print(x)

'''

输出:
Bill#Steve#Elon
'''

实例2:

myDict = {"name": "Bill", "country": "USA"}
mySeparator = "TEST"
x = mySeparator.join(myDict)
print(x)

'''
输出:
nameTESTcountry
'''

注释:在使用字典作为迭代器时,返回的值是键,而不是值。

split(separator, max)

将字符串拆分为列表,您可以指定分隔符,默认分隔符是任何空白字符。若指定 max,列表将包含指定数量加一的元素。

实例1:

txt = "welcome to China"
x = txt.split()
print(x)

'''
输出:
['welcome', 'to', 'China']
'''

实例2:

txt = "apple#banana#cherry#orange"
# 将 max 参数设置为 1,将返回包含 2 个元素的列表!
x = txt.split("#", 1)
print(x)

'''
输出:
['apple', 'banana#cherry#orange']
'''

内置函数

enumerate()

用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

实例1:

>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
...     print i, element
... 
0 one
1 two
2 three

实例2:

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

exec()

exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。

# 单行语句字符串
>>>exec('print("Hello World")')
Hello World

#  多行语句字符串
>>> exec ("""for i in range(5):
...     print ("iter time: %d" % i)
... """)
iter time: 0
iter time: 1
iter time: 2
iter time: 3
iter time: 4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/462601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排序 - 插入排序(Insertion Sort)

文章目录 插入排序介绍插入排序实现插入排序的时间复杂度和稳定性插入排序时间复杂度插入排序稳定性 代码实现核心&总结 每日一道算法&#xff0c;提高脑力。第三天&#xff0c;插入排序。 插入排序介绍 直接插入排序(Straight Insertion Sort)的基本思想是: 把n个待排序…

浅谈个人对“孔乙己的长衫“的感受

名人说&#xff1a;往者不可谏&#xff0c;来者犹可追。——《论语微子篇》 创作者&#xff1a;Code_流苏(CSDN) ★温馨提示&#xff1a;以下仅代表个人观点&#xff0c;不代表其它任何人看法。 目录 〇、缘由一、社会对于学历和职业之间的关系认知是怎样的&#xff1f;二、学…

android studio AlertDialog弹出对话框

1.定义弹出的对话框的按钮和显示结果的文本框 <Buttonandroid:id"id/btn7"android:layout_width"match_parent"android:layout_height"wrap_content"android:background"drawable/btn_nine_selector"android:text"弹出对话提醒…

ROS学习第三十五节——URDF集成Gazebo实操

https://download.csdn.net/download/qq_45685327/87719249 1.编写封装惯性矩阵算法的 xacro 文件 head.xacro <robot name"base" xmlns:xacro"http://wiki.ros.org/xacro"><!-- Macro for inertia matrix --><xacro:macro name"sp…

微软杀疯了,谷歌蒸发1000亿市值作陪,中文编程和它却打起翻身仗

微软VS谷歌&#xff0c;究竟谁是最后赢家&#xff1f; 当微软宣布收购OpenAI开发的ChatGPT的决定一出&#xff0c;Google深感威胁&#xff0c;开发出Gmail的早期员工甚至大胆预测&#xff0c;Google离完全毁灭只剩下一到两年&#xff01; 好歹也在互联网之战中屹立多年&#…

密码学|AES加密算法|学习记录

AES简介 AES加密是分组加密的一种 明文长度为固定的128位 密钥可长度为128&#xff0c;192&#xff0c;256位 128bit16字节&#xff0c;在AES中我们将数据用4x4字节的矩阵表示。&#xff08;注排列顺序为先从上到下再从左到右&#xff09; AES的一般步骤 对于上图最终轮区…

ChatGPT生成式算法及发展历程

引言 GPT&#xff08;Generative Pre-Trained Transformer&#xff09;系列是OpenAI开发的一系列以Transformer[2]为基础的生成式预训练模型&#xff0c;这个系列目前包括文本预训练模型GPT-1[3]&#xff0c;GPT-2[4]&#xff0c;GPT-3[5]&#xff0c;InstructGPT[7]、ChatGPT…

项目范围控制:如何控制项目范围的变化?

一个成功的项目需要在进度、成本和质量之间取得平衡。控制项目交付范围是实现这个平衡的关键。然而&#xff0c;项目范围是会变化的&#xff0c;因此控制项目范围变化是必要的。 如何控制项目范围的变化&#xff1f; 1、了解项目的交付范围 项目经理、团队成员、利益相关者和…

手把手带你理解Spring日志原理

文章目录 1 楔子2 jcl原理分析2.1 依赖坐标2.2 API调用2.3 源码分析 3 slf4j原理分析3.1 依赖坐标3.2 API调用3.3 源码分析 4 spring是如何选择日志技术的&#xff1f;4.1 场景一&#xff1a;通过log4j2打印日志4.1.1 引入maven依赖4.1.2 编写配置文件4.1.3 执行测试方法4.1.4 …

陆奇博士最新演讲分享:我的大模型世界观(附PPT下载链接)

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年3月份热门报告合集 【限时免费】ChatGPT4体验&#xff0c;无需翻墙直接用 ChatGPT调研报告&#xff08;仅供内部参考&#xff09; ChatGPT的发展历程、原理、技术架构…

使用WireShark抓包分析TCP_IP协议

文章目录 前言一、TCP/IP协议1.1 OSI分层1.2 TCP/IP 分层 二、抓包2.1 Socket代码2.2 过滤包 三、分析3.1 TCP首部3.2 实战分析3.3 三次握手3.4 四次挥手 参考 前言 TCP/IP 协议 是一组用于互联网通信的协议。它由两个主要协议组成&#xff1a;传输控制协议&#xff08;TCP&am…

【视频课程】算法工程师需要的ChatGPT大模型算法理论与实践课程!非粗浅科普...

前言 自从2022年11月ChatGPT发布之后&#xff0c;迅速火遍全球。其对话的交互方式&#xff0c;能够回答问题&#xff0c;承认错误&#xff0c;拒绝不适当的请求&#xff0c;高质量的回答&#xff0c;极度贴近人的思维的交流方式&#xff0c;让大家直呼上瘾&#xff0c;更是带火…

【Java】面试常问知识点(计算机网络方面)

计算机网络 OSI七层模型 应用层 (Application): 网络服务与最终用户的一个接口。 协议有:HTTP FTP TFTP SMTP SNMP DNS 表示层(Presentation Layer): 数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层) 格式有&#xff0c;JPEG、ASCll、DECOIC、加密格式等 会…

# VGA协议实践

VGA协议实践 文章目录 VGA协议实践1.VGA介绍2. ALTPLL3. 字模与图像生成4. ROM5. 代码5.1 vga驱动模块5.2 显示数据生成模块5.3 按键消抖模块5.4 顶层模块5.5 TCL绑定引脚代码 6. 效果7.总结8.参考文章 1.VGA介绍 VGA:Video Graphics Array视频图形阵列是IBM于1987年提出的一个…

【react全家桶学习】react中函数组件和类式组件(超详/必看)

函数式组件定义及特点 定义&#xff08;核心就是一个函数&#xff0c;返回虚拟dom&#xff09;&#xff1a; import React from reactexport default function index() {return <div>index</div> }特点&#xff1a; 1、适用于【简单组件】的定义2、是一个函数&a…

macOS与Ubuntu困惑解答

homebrew&#xff08;报管理器&#xff09;、yaml、apt-get、apt是包管理工具&#xff1b; zsh、bash都是解释器&#xff0c;是shell语言的解释器&#xff0c;都是服务于shell语言的&#xff0c;它们之间的区别是&#xff0c;zsh能够很好的兼容bash&#xff0c;zsh更优雅&…

web端导航菜单系列

导航菜单属于导航中最常规的一种导航模式&#xff0c;它有2个显而易见的用途&#xff1a;帮助我们找到想要的任何东西和告诉我们现在身在何处。帮助用户在不同页面之间跳转找到目标功能。 导航作为网站或者平台的骨架&#xff0c;是产品设计中不容忽视的一环。结合自身对于导航…

java第一课

常用dos命令 第一个e&#xff1a;加上回车&#xff0c;直接切换到e盘目录 看e盘文件的文件夹 dir加回车 进入文件夹 cd 文件夹名称加回车 进入文件夹就是 cd加文件夹名称 cd 加一个文件夹的名称就是进入这个文件夹 回退就是cd.. (这样子是单级目录的回退) 进入很多个就是进入…

必备装机软件,软件推荐

https://www.den4b.com/download/renamer/installer?key9d97aa7096681c8342442f75e34f7d5a8b13551ee3283956323516c81b1fe91b 官网https://www.den4b.com/ 从不同的文件夹中选择文件并将它们添加到工作区域。 a、 更改添加文件夹按钮的默认行为(可选步骤) b、添加单独选择的文…

数据库基础篇 《14.视图》

数据库基础篇 《14.视图》 1. 常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0…