第十章 调试
1. 异常处理
(1)使用try、except抛出异常
try:
return 42/0
except ZeroDivisionError: #当该错误出现时,打印信息
print('分母不能为0')
try:
raise Exception('这是一个错误')
except Exception as err: #将Exception对象保存到err变量中
print(str(err))
一般来说,这个语句可以防止try语句中的程序出错导致整个程序崩溃
(2) 反向追踪错误信息字符串
使用traceback模块中的traceback.format_exc()函数可以获取Exception对象并返回它的字符串格式,这样就可以将其写入到错误日志文件夹以便调阅。
import traceback
try:
raise Exception('这是一个错误信息')
except:
errorFile = open('errorInfo.txt','w') #写入模式打开错误文件
erroeFile.write(traceback.format_exc()) #写入Exception对象的字符串
errorFile.close()
print('错误已记录')
2.断言
(1)assert关键词
内容:assert关键字、条件(求值为Ture或者False)、逗号、当条件为False时显示的字符串
x=20
assert x==20,'数字必须是20'
x=25
assert x==20,'数字必须是20'
输出为:
(2)在运行Python时传入-O选项可以禁用断言语句(在命令窗口运行python程序时)
3. 日志
(1)使用logging模块显示日志信息:
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
logging.debug('输出DEBUG级别日志信息')
(2)日志级别
级别 | 日志函数 | 简介 |
---|---|---|
DEBUG | logging.debug() | 最低级别,用于小细节 |
INFO | logging.info() | 一般级别 |
WARNING | logging.warning() | 可能出现问题的地方 |
ERROR | logging.error() | 记录错误 |
CRITICAL | logging.critical() | 最高级别,记录致命错误 |
ps.在(1)中的basicConfig()函数可以改变其level参数的的值来改变需要输出的日志信息,logging.DEBUG只显示debug级别的日志,logging.ERROR将显示ERROR和CRITICAL这种会导致程序崩溃的错误日志
(3)设置日志文件并写入日志信息:
import logging
logging.basicConfig(filename='logFile.txt',level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
(4)禁用日志
程序调试完成后,且没有发现什么大的问题就可以调用logging.disable()函数来禁用logging模块:
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
logging.debug('输出日志信息')
logging.disable(logging.CRITIACL) #禁用所有日志
logging.disable(logging.DEBUG) #禁用debug级别的日志
logging.disable(logging.ERROR) #禁用ERROR级别及以下的日志
4. IDLE调试器
主要按钮作用:
按钮 | 作用 |
---|---|
GO | 运行程序到断点或结束 |
Step | 运行到下一行代码或者下一行函数中的第一行,然后暂停 |
Over | 类似Step,但会直接得到下一行的函数的返回值 |
Out | 离开由Step进入的函数 |
Quit | 完全停止调试器 |
5. 实践作业——调试硬币抛掷
import random
guess =''
while guess not in ('正面','反面'):
print('猜猜是正面还是反面')
guess = input()
toss = random.randint(0,1)
#改正——————————————————————
if toss == 0:
toss = '正面'
else :
toss = '反面'
#区间——————————————————————
if toss == guess:
print('你赢了')
else:
print('再给你一次机会')
guess = input()
if toss ==guess:
print('好吧,你赢了')
else:
print('你输了')
第十一章 从Web抓取信息
1. 使用webbrowser模块
import webbrowser
webbrowser.open('https://www.baidu.com') # 直接用默认浏览器打开这个网页
2. 使用requests模块
import requests
res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt') #下载文件
res.raise_for_status() #程序无反应表示文件下载正常
playFile = open('罗密欧.txt','wb')
#逐字写入到该文件
for chunk in res.iter_content(10000):
playFile.write(chunk)
playFile.close()
ps.iter_comtent()方法可以获取下载文件的内容
3. 使用BeautifulSoup(bs4)模块
(1)select()选择器匹配对象
方法 | 匹配 |
---|---|
soup.select(‘div’) | 所有 div元素(多个元素列表) |
soup.select(’#author’) | 带有id='author’的元素 |
soup.select(’.notice’) | 带有class=‘notice’的元素 |
soup.select(‘div span’) | 所有在div元素下的span元素 |
soup.select('div > span‘) | 所有直接在div元素下的span元素,中间没有其他元素 |
soup.select(‘input[name]’) | 所有input元素且有一个name 属性 |
soup.select('input[type=“button”]’) | 所有input元素且有一个type=‘button’ 属性 |
ps.soup表示获取的网页存放的变量
(2)简略使用
import requests,bs4
res = requests.get('http://jjxxw.cq.gov.cn/zwgk_213/fdzdgknr/zcwj/qtwj/') #下载网站主页
res.raise_for_status()
html = bs4.BeautifulSoup(res.text) #获取网站的文本格式
fileList = html.select('ul[class="cwx-list"]') #获取ul[class="cwx-list"]元素
len(fileList)
title = html.select('ul[class="cwx-list"] > li > a')
4. 使用selenium模块
(1)启动浏览器
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://www.baidu.com')
ps.在使用谷歌浏览器时,需要安装浏览器名为chromedriver的驱动程序
(2)页面中寻找元素
匹配元素有两种方法;
方法 | 作用 |
---|---|
find_element_* | 返回匹配到的第一个WebElement对象 |
find_elements_* | 返回匹配到的所有WebElement对象的列表 |
在browser上寻找WebElement对象(WebElements):
方法名 | 对象 |
---|---|
browser.find_element_by_class_name(‘bookcover’) | class ="bookcover"的元素 |
browser.find_element_by_css_selector(selector) | 匹配CSS selector的元素 |
browser.find_element_by_id(id) | 匹配id=“id” 的元素 |
browser.find_element_by_link_text(text) | 完全匹配提供text的< a>元素 |
browser.find_element_by_partial_link_text(text) | 包含提供text的< a>元素 |
browser.find_element_by_name(name) | 匹配name属性的元素 |
browser.find_element_by_tag_name(name) | 匹配标签name属性的元素(大小写无关) |
获取WebElement对象的属性
属性或方法 | 描述 |
---|---|
tag_name | 标签名 |
get_attribute(name) | 该元素name属性的值 |
text | 该元素内的文本 |
clear(‘x’) | 对于文本字段或文本区域元素,清除其中输入的文本x |
is_displayed() | 该元素是否可见 |
is_enabled(‘x’) | 该检查输入元素x是否启用 |
is_selected() | 对于复选框和单选框元素是否被选中 |
location | 一个字典,表示该元素在页面上的位置 |
(3)点击页面
由find_element_*和find_elements_*返回的WebElement对象可以调用click()方法模拟鼠标点击这个对象。
(4)填写提交表单
1 | 2 | 3 |
---|---|---|
找到页面中的< input> 或者< textarea>元素 | 调用send_keys()输入文本 | 调用submit()提交文本 |
(5)模拟键盘
以求方便,先导入详细模块
from selenium.webdriver.common.keys import Keys
属性 | 含义 |
---|---|
Keys.DOWN, Keys.Up, Keys.LEFT, Keys.RIGHT, | 上下左右方向键 |
Keys.ENTER , Keys.RETURN | 回车和换行键 |
Keys.HOME, Keys.END, Keys.PAGE_DOWN, Keys.PAGE_UP | Home、End、Page down、Page up键 |
Keys.ESCAPE,Keys.BACK_SPACE,Keys.DELETE | Esc 、Backspace、字母键 |
Keys.F1 ,Keys.F2 …Keys.F12 | F1至F12 |
Keys.RAB | Tab键 |
(6)模拟浏览器按钮
方法 | 含义 |
---|---|
browser.back() | 点击返回按钮 |
browser.forward() | 点击前进按钮 |
browser.refresh() | 点击刷新按钮 |
browser.quit() | 点击关闭窗口按钮 |
5. 实践项目
见复习