一起学爬虫——使用Beautiful Soup爬取网页!

要想学好爬虫,必须把基础打扎实,之前发布了两篇文章,分别是使用XPATH和requests爬取网页,今天的文章是学习Beautiful Soup并通过一个例子来实现如何使用Beautiful Soup爬取网页。

什么是Beautiful Soup

Beautiful Soup要和其他的解析器搭配使用,例如Python标准库中的HTML解析器和其他第三方的lxml解析器,由于lxml解析器速度快、容错能力强,因此一般和Beautiful Soup搭配使用。

初始化Beautiful Soup对象的代码

html = 
'''
Hello Beautiful Soup

Hello

''' soup = BeautifulSoup(html,'lxml')

只需把第二个参数写成"lxml"即可使用lxml解析器初始化Beautiful Soup对象。

Beautiful Soup提供了三种选择器用去爬取节点中的数据,分别是节点选择器、方法选择器和CSS选择器。下面分别介绍着三个选择器的用法

节点选择器:

HTML网页有title、p、a、head、tr、td等节点。通过Beautiful Soup对象+"."+节点即可直接访问到节点。

Beautiful Soup对象+"."+节点+"."+string即可提取到节点的文本信息。

用法 描述 soup.title 选择第一个title节点 soup.title.string 提取一个title节点的文本信息 soup.title.attrs 获取一个title节点的所有属性,返回的结果的词典。

如果有class属性,则class属性返回的是list,class属性之间以空格当做分隔符 soup.p.contents 获取一个p节点的所有直接子节点。

方法返回的是第一个p节点中包含的所有直接子字节点和文本,

不包含孙节点,两个节点之间的文本也当做是一个节点返回。

返回的结果是列表 soup.p.children 返回第一个p节点的所有直接子节点,返回的结果是list_iterator对象 soup.p.descendants 获取一个p节点的所有子孙节点 soup.a.parent 获取一个a节点的父节点 soup.a.parents 获取一个a节点的所有祖先节点 soup.p.next_siblings 获取一个p节点的下一个兄弟节点 soup.p.prevIoUs_siblings 获取一个p节点的上一个兄弟节点 方法选择器:

根据传入的参数查找符合条件的节点。

下面是方法选择器提供的方法

方法 描述 find_all(name,attrs,recursive,text,**kwargs) 根据传入参数查找所有符合条件的节点,

name是节点名,attrs属性值,text文本内容等。

text参数可以是字符串,也可以是正则表达式:

soup.find_all(text=re.compile('test')) find(name,**kwargs) 返回第一个符合条件的节点 find_parents() 返回所有祖先节点 find_parent() 返回父节点 find_next_siblings() 往后查找,所有兄弟节点 find_next_sibling() 往后查找,返回第一个兄弟节点 find_prevIoUs_siblings() 往前查找,返回所有兄弟节点 find_prevIoUs_sibling() 往前查找,返回第一个兄弟节点 在使用上面的方法时,如果参数中有Python的关键字,则需要在参数下面加一个下划线,例如下面的代码,class是Python的关键字,必须在class后加下划线class_="title_class":

from bs4 import BeautifulSoup
html = '''

 
 
 <p>
 <a href = "./test_beautifulsoup.html">test beautifulsoup link<a>
</p>
 <ul>
 <li class="animal">cat</li>
 <li class="animal">dog</li>
 </ul>
 </body>
</html>
'''
soup = BeautifulSoup(html,'lxml')
print(soup.find_all(name='title',class_='title_class'))
</pre>
<p>CSS选择器:</p>
<p>BeautifulSoup还<a href="https://www.jb51.cc/tag/zhichi/" target="_blank" class="keywords">支持</a><a href="https://www.jb51.cc/tag/huoqu/" target="_blank" class="keywords">获取</a>css元素,例如ul、div、li等元素。CSS选择器主要提供select()<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a><a href="https://www.jb51.cc/tag/huoqu/" target="_blank" class="keywords">获取</a>符合条件的节点(Tag对象),然后通过节点的get_text()<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>和text<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>可以<a href="https://www.jb51.cc/tag/huoqu/" target="_blank" class="keywords">获取</a>该节点的文本值。</p>
<p>select<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>还可以根据css的样式规则选择相应的节点:</p>
<pre>
from bs4 import BeautifulSoup
html = '''
<html>
 <body>
 <title id="title_id" class="title_class" name="title name">Test BeautifulSoup
 

''' soup = BeautifulSoup(html,'lxml') print('
获取id为title_的所有节点') print(soup.select('#title_id')) print('获取class为title_的所有节点') print(soup.select('.title_class')) print('获取所有UL节点下面的所有li节点') print(soup.select('ul li')) print('获取所有class为fruit节点下的所有li节点') print(soup.select('.fruit li')) print('获取所有class为fruit节点下的第一个li节点的文本值') print(soup.select('.fruit li')[0].string) print('获取所有class为fruit节点下的第一个li节点的文本值') print(soup.select('.fruit li')[0].get_text()) print('获取所有class为fruit节点下的第一个li节点的class属性值,注意class属性返回的是list列表,属性之间用空格分隔') print(soup.select('.fruit li')[0].attrs['class']) print(soup.select('.animal li')[1].attrs['class']) print('循环迭代所有ul下面的所有li节点的文本值') for li in soup.select('ul li'): print(li.text)

下面使用Beautiful Soup爬取豆瓣音乐排行榜

在浏览器中打开豆瓣音乐排行榜,打开浏览器,输入网址: https://music.douban.com/chart,我们要抓取的是每首歌曲的排名、歌曲名、演唱者、播放次数、上榜天数等数据 。

一起学爬虫——使用Beautiful Soup爬取网页!

进学习交流群:548377875   海量学习教程,大牛随时答疑!

下面分析怎么通过beautiful soup抓取到我们的数据。

通过开发者工具,我们可以看到所有歌曲是在class为article的div中,然后每首个在class为clearfix的li中。

一起学爬虫——使用Beautiful Soup爬取网页!

因此首先使用css选择器获取到class为article下面的所有li节点:

soup.select(".article li")

然后查看每首歌曲的HTML代码

一起学爬虫——使用Beautiful Soup爬取网页!

红色框部分是一首歌的HTML代码

歌曲排名在class为“gree-num-Box”的span节点中,因为span节点是

  • 获取排名的代码为: li.span.text

    绿色框中A节点中是歌曲的链接图片链接获取歌曲链接代码为: li.a['href']

    蓝色框中是歌曲的名字、演唱者和播放次数,歌曲名是在class="icon-play"的H3节点中,因此可以使用方法选择器中的find()方法获取到H3节点,然后获取H3节点下面a节点中的文本信息就是歌曲的名字,代码为: li.find(class_="icon-play").a.text

    获取演唱者和播放次数代码为:

    li.find(class_="intro").p.text.strip()

    获取上榜天数的代码为:

    li.find(class_="days").text.strip()
    

    在豆瓣音乐排行榜页面一个现实20首歌曲,前面10首歌曲会有图片,后面10首歌曲是没有图片的,因此后面10首歌曲将不获取图片的地址。

    另外还有一点需要注意的是,后面10首歌曲的演唱者和播放次数是在class="icon-play"的p节点中:

    一起学爬虫——使用Beautiful Soup爬取网页!

    而该节点中有a节点,要想获取a节点外的信息,必须使用节点选择器的contents方法

    li.find(class_="intro").p.contents[2].strip()

    contents返回的是p节点的直接子节点,以列表的形式返回,这里返回列表中有3个元素,分别是

    后的字符串,a节点、演唱者/播次数。contents会将直接子节点之间的换行符也当做一个元素。

    代码整理后如下:

    # coding:utf-8
    from bs4 import BeautifulSoup
    import requests
    def parseHtml(url):
     headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"}
     response = requests.get(url,headers=headers)
     soup = BeautifulSoup(response.text,'lxml')
     #使用css选择器获取class="article"的节点下面的所有li节点
     for index,li in enumerate(soup.select(".article li")):
     if(index <10):
     print('歌曲排名:' + li.span.text)
     print('歌曲链接:' + li.a['href'])
     print('歌曲名:' + li.find(class_="icon-play").a.text)#使用方法选择器
     print('演唱者/播放次数:' + li.find(class_="intro").p.text.strip())
     print('上榜时间:'+li.find(class_="days").text.strip())
     else:
     print('歌曲排名:' + li.span.text)
     print('歌曲名:' + li.find(class_="icon-play").a.text)
     print('演唱者/播放次数:' + li.find(class_="intro").p.contents[2].strip())#方法选择器和节点选择器搭配使用
     print('上榜时间:' + li.find(class_="days").text.strip())
     print('—————————————————强力分隔符———————————————————')
    def main():
     url = "https://music.douban.com/chart"
     parseHtml(url)
    if __name__ == '__main__':
     main()
    

    本文通过爬取豆瓣音乐排行榜的小项目学习了如何使用Beautiful Soup的节点选择器、方法选择器、CSS选择器来爬取一个网页。这三个选择器可以混合搭配使用。

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

  • 相关推荐


    我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
    说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
    记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
    文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
    文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
    文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
    首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
    seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
    Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
    1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
    1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
    文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
    文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
    文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
    Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
    1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
    文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
    文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
    mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
    文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实