爬取菜鸟教程python-100例的每个例题文本
工具准备:
IDE:Pycharm
库:requests、bs4
知识储备
find()只返回第一个匹配到的对象,一般是第一个匹配到的对象
find_all()返回所有匹配的对象
库的导入:
import requests
from bs4 import BeautifulSoup
获取网页内容
1.获取url
(1)python-100例的url
(2)练习的url
网页的url:https://www.runoob.com/python/python-100-examples.html
url='https://www.runoob.com/python/python-100-examples.html'
#伪装自己,让机器认为每次都是认为是浏览器去访问
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
}
#1.发送请求
r=requests.get(url,headers=headers).content.decode('utf-8')
print(r)
注意这里的headers,添加headers我的理解是可以让机器认为是浏览器去访问的网址
header的获取方法:
1.打开网页,右击检查
2.点击network,会发现里面什么都没有
解析文档
#2.解析html文档
#创建BeautifulSoup对象用来解析文档
soup=BeautifulSoup(r,'lxml')
#可以打印soup的类型查看
# print(type(soup))
获取例题的url;
通过网页检查,使用检查页面左上角的符号定位你要获取的内容
可以发现,每个例题的链接是在标签id为content的ul的标签下的所有a标签 这句话有点绕口,可以倒着解释,a标签是在ul下,而ul又是在代码如下:
#3.查找每个练习的a链接的herf属性并获取链接地址
re_a=soup.find(id='content').ul.find_all('a')
#返回的是100个a标签的列表 包括链接和文本
将所有的例题链接放进一个列表中
#将所有的链接地址存放在一个列表中
list=[]
for i in re_a:
list.append(i.attrs['href'])
#attrs['href']只获取标签a中的链接内容
attrs[‘标签名’]是获取属性值
请求每个链接地址的联系,获得页面内容
for x in list:
#创建一个字典用来保存获取的内容
dic={}
ar=requests.get('https://www.runoob.com'+x,headers=headers).content.decode('utf-8')
#解析文档
soup2=BeautifulSoup(ar,'lxml')
#查找练习内容
#1.查找标题
dic['title']=soup2.find(id='content').h1.text
# print(title)
#2.查找题目内容
dic['tm']=soup2.find(id='content').find_all('p')[1].text
#print(tm)
#3.程序分析
dic['analysis']=soup2.find(id='content').find_all('p')[2].text
#print(analysis)
#4.源代码
#class在 python 中是关键保留字,不能再将这些字作为变量名或过程名使用,所以class_ 应运而生
#try except 异常模块处理
try:
dic['code']=soup2.find(class_='hl-main').text
except:
dic['code'] = soup2.find('pre').text
最后用到了python的异常处理机制try…except…
try except 语句的执行流程如下:
(1)首先执行 try 中的代码块,如果执行过程中出现异常,系统会自动生成一个异常类型,
并将该异常提交给 Python 解释器,此过程称为捕获异常。
(2)当 Python 解释器收到异常对象时,会寻找能处理该异常对象的 except 块,
如果找到合适的 except 块,则把该异常对象交给该 except 块处理,
这个过程被称为处理异常。如果 Python 解释器找不到处理异常的 except 块,
则程序运行终止,Python 解释器也将退出。
原因:不是每个例题的代码都是在class=‘h1-main’中,如下图所示
这里简写成’pre’
保存文件
with open('python-100.csv','a+',encoding='utf-8') as file:
file.write(dic['title']+'\n')
file.write(dic['tm']+'\n')
file.write(dic['analysis']+'\n')
file.write(dic['code']+'\n')
file.write('*'*50+'\n')
检查文件
已经保存在文件名为python-100中