👨💻个人主页:@开发者-曼亿点
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 曼亿点 原创
👨💻 收录于专栏:机器学习
⭐🅰⭐
—
文章目录
⭐前言⭐
Python中文开发者社区是一个Python开发者学习交流的社区门户网站,也是一个非营利性的公益网站,它致力于壮大Python中国开发者群体,帮助Python开发者解决开发中遇到的各种问题。本任务将带领大家编写Python程序,利用beautifulsoup4库,爬取Python中文开发者社区基础教程的数据。
🎶一、网页基础
1.HTML
超文本标记语言(hyper text marked language,HTML)是一种用于描述网页的语言。它通过不同类型的标签来描述不同的元素,各种标签通过不同的排列和嵌套形成网页的框架。有的标签还带有属性参数,其语法格式如下。
常用的标签如表所示。
【温馨提示】:打开浏览器的开发者工具窗口,选择“Elements”选项,即可查看HTML源代码
2.HTML DOM
文档对象模型(document object model,DOM)定义了访问HTML和可扩展标记语言(extensible markup language,XML)文档的标准。HTML DOM将HTML文档呈现为带有元素、属性和文本的树结构(也称为节点树),如图所示。
🎶二、beautifulsoup4库
1.beautifulsoup4基本用法
beautifulsoup4库也称为Beautiful Soup库或bs4库,用于解析HTML或XML文档。beautifulsoup4库不是Python内置的标准库,使用之前需要安装。
beautifulsoup4库中最重要的是BeautifulSoup类,它的实例化对象相当于一个页面。解析网页时,需要使用BeautifulSoup()创建一个BeautifulSoup对象,该对象是一个树形结构,包含了HTML页面中的标签元素,如、等。也就是说,HTML中的主要结构都变成了BeautifulSoup对象的一个个属性,然后可通过“对象名.属性名”形式获取该对象的第一个属性值(即节点)。
【温馨提示】: BeautifulSoup对象的属性名与HTML的标签名相同,HTML常用的标签见表。
每一个HTML标签在beautifulsoup4库中又是一个对象,称为Tag对象,它有4个常用属性,如表3所示。
其中,attrs返回的是标签的所有属性组成的字典类型的数据,可通过“atrrs[‘属性名’]”形式获取属性值。
【例1】爬取链家租房网站的内容(网址https://bj.lianjia.com/zufang/),通过beautifulsoup4库解析网页,输出第一个li节点的类型、内容及其属性等信息。
【问题分析】 在Google Chrome浏览器中访问https://bj.lianjia.com/zufang/,查看并分析HTML源代码,可以看到第一个li节点的源代码,如图所示。
【参考代码】
import requests #导入requests库
from bs4 import BeautifulSoup #从bs4库中导入BeautifulSoup模块
url ='https://bj.lianjia.com/zufang/' #定义url字符串
headersvalue ={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',}
#发送请求,并将返回结果赋值给r
r = requests.get(url, headers=headersvalue)
#创建BeautifulSoup对象,并设置使用lxml解析器
soup =BeautifulSoup(r.text,'lxml')print('soup类型:',type(soup)) #输出soup类型
print('“soup.li”类型:',type(soup.li)) #输出“soup.li”类型
print('第一个li节点:\n', soup.li) #输出第一个li节点
#输出第一个li节点的name属性
print('第一个li节点的name属性:', soup.li.name)
#输出第一个li节点的contents属性
print('第一个li节点的contents属性:', soup.li.contents)
#输出第一个li节点的string属性
print('第一个li节点的string属性:', soup.li.string)
#输出第一个li节点的attrs属性
print('第一个li节点的attrs属性:', soup.li.attrs)
#输出第一个li节点的attrs属性的“class”属性值
print('第一个li节点的attrs属性的“class”属性值:',
soup.li.attrs['class'])
#输出第一个li节点下a节点的string属性
print('第一个li节点下a节点的string属性:', soup.li.a.string)
【运行结果】 程序运行结果如图所示。
2.CSS选择器
beautifulsoup4库提供了使用CSS选择器来选择节点的方法,只需调用select()方法传入相应的CSS选择器即可,常用的选择器如表所示。
【例2】爬取链家租房网站的内容(网址https://bj.lianjia.com/zufang/),使用CSS选择器选择节点,输出第一个房源的小区和楼层信息。
【问题分析】 在Google Chrome浏览器中访问https://bj.lianjia.com/zufang/,打开浏览器的开发者工具窗口,选择“Elements”选项后单击左上角“”按钮,然后使用鼠标选择网页中的某处,即可直接定位到HTML中对应的节点,如图所示。可以看出,第一个房源的小区信息包含在class属性值为content__list–item–des的节点下的a节点中,楼层信息包含在span节点中。
【参考代码】
import requests #导入requests库
from bs4 import BeautifulSoup #从bs4库中导入BeautifulSoup模块
url ='https://bj.lianjia.com/zufang/' #定义url字符串
headersvalue ={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',}
#发送请求,并将响应赋值给r
r = requests.get(url, headers=headersvalue)
#创建BeautifulSoup对象,并设置使用lxml解析器
soup =BeautifulSoup(r.text,'lxml')
#将class属性值为“content__list--item--des”的第一个节点赋值给node
node = soup.select('.content__list--item--des')[0]print('第一个房源小区信息:')for node_a in node.select('a'):#循环输出node节点下a节点的文本
print(node_a.string, end=' ')
#输出node节点下span节点中的楼层信息
print('\n第一个房源楼层信息:',
node.select('span')[0].contents[2].strip())
【运行结果】 程序运行结果如图所示。
完成本任务,须首先发送HTTP请求,然后将爬取到的文章按标题保存到TXT文件中,并输出每篇文章下载完成的提示。具体实现步骤如下。
(1)定义请求的URL字符串(base_url)和请求头字典(headersvalue),其中,base_url赋值为https://www.pythontab.com/html/pythonjichu/,即Python中文开发者社区的Python基础教程首页;headersvalue包含User-Agent信息。
(2)定义get_onepage_url(url)函数获取每一网页10篇文章的URL,并保存在列表中。
(3)定义get_article(url)函数获取每一篇文章的内容,在其中调用towrite()函数保存文章内容,并输出下载完成提示。
(4)定义towrite(title,content)函数将文章内容保存到TXT文件中,以文章标题命名文件保存在文件夹时,由于文件名不能包含一些特殊字符,须对文章标题中包含的特殊字符进行处理。
(5)定义main()函数,在当前工作目录中创建“Python基础教程”文件夹,循环30次,组合网页的URL,并调用get_onepage_url()函数返回url列表,然后遍历列表,调用get_article()函数。
(6)调用main()函数运行程序。
结束语🥇
以上就是机器学习
持续更新机器学习教程,欢迎大家订阅系列专栏🔥机器学习
你们的支持就是曼亿点创作的动力💖💖💖
版权归原作者 曼亿点 所有, 如有侵权,请联系我们删除。