我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一起学爬虫——使用Beautiful S

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一起学爬虫——使用Beautiful S

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

什么是Beautiful Soup

  • Beautiful Soup是一款高效的Python网页解析分析工具,可以用于解析HTL和XML文件并从中提取数据。
  • Beautiful Soup输入文件的默认编码是Unicode,输出文件的编码是UTF-8。
  • Beautiful Soup具有将输入文件自动补全的功能,如果输入的HTML文件的title标签没有闭合,则在输出的文件中会自动补全,并且还可以将格式混乱的输入文件按照标准的缩进格式输出。

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

初始化Beautiful Soup对象的代码:

html = 
'''
<html><title>Hello Beautiful Soup</title><p>Hello</p></html>
'''
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,attrs,recursive,text,**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 = '''
<html>
    <body>
        <title id="title_id" class="title_class" name="title name">Test BeautifulSoup</title>
        <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'))

CSS选择器:
BeautifulSoup还支持获取css元素,例如ul、div、li等元素。CSS选择器主要提供select()方法获取符合条件的节点(Tag对象),然后通过节点的get_text()方法和text属性可以获取该节点的文本值。

select方法还可以根据css的样式规则选择相应的节点:

from bs4 import BeautifulSoup

html = '''
<html>
    <body>
        <title id="title_id" class="title_class" name="title name">Test BeautifulSoup</title>
        <p>
            <a href = "./test_beautifulsoup.html">test beautifulsoup link<a>
            
        </p>
        <ul class="animal" id="aninal_id">
            <li class="cat">cat</li>
            <li class="animal dog">dog</li>
        </ul>
        <ul class="fruit" id = "fruit_id">
            <li class="apple">apple</li>
            <li class="banana">banana</li>
        </ul>
    </body>
</html>
'''

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,我们要抓取的是每首歌曲的排名、歌曲名、演唱者、播放次数、上榜天数等数据。
python beautifulsoup

下面分析怎么通过beautiful soup抓取到我们的数据。
通过开发者工具,我们可以看到所有歌曲是在class为article的div中,然后每首个在class为clearfix的li中。
python beautifulsoup
因此首先使用css选择器获取到class为article下面的所有li节点:

soup.select(".article li")

然后查看每首歌曲的html代码:
python beautifulsoup
红色框部分是一首歌的html代码。
歌曲排名在class为“gree-num-box”的span节点中,因为span节点是<li class="clearfix">节点的子节点,获取排名的代码为: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节点中:
python beautifulsoup

而该节点中有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选择器来爬取一个网页。这三个选择器可以混合搭配使用。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一起学爬虫——使用Beautiful S

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一起学爬虫——使用Beautiful S

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

一起学爬虫——使用xpath库爬取猫眼电

之前分享了一篇使用requests库爬取豆瓣电影250的文章,今天继续分享使用xpath爬取猫眼电影热播口碑榜XPATH语法XPATH(XML Path Language)是一门用于从XML文件中查找信息的语言。通用适用于从HTML文件中查
2023-01-30

一起学爬虫——一步一步打造爬虫代理池

最近在使用爬虫爬取数据时,经常会返回403代码,大致意思是该IP访问过于频繁,被限制访问。限制IP访问网站最常用的反爬手段了,其实破解也很容易,就是在爬取网站是使用代理即可,这个IP被限制了,就使用其他的IP。对于高大上的公司来说,他们基本
2023-01-30

Python使用Beautiful Soup包编写爬虫时的一些关键点

1.善于利用soup节点的parent属性 比如对于已经得到了如下html代码: 2022-06-04

如何使用python爬虫爬取大学排名信息

这篇文章将为大家详细讲解有关如何使用python爬虫爬取大学排名信息,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。2. 这次爬取的网址请搜索“阿凡题”(纯技术讨论)“阿凡题”(纯技术讨论)3. 在该网址选
2023-06-02

小程序开发(一):使用scrapy爬虫

过完年回来,业余时间一直在独立开发一个小程序。主要数据是8000+个视频和10000+篇文章,并且数据会每天自动更新。我会整理下整个开发过程中遇到的问题和一些细节问题,因为内容会比较多,我会分成三到四篇文章来进行,本文是该系列的第一篇文章,
2023-01-31

使用python编写简单网络爬虫(一)

总算有时间动手用所学的python知识编写一个简单的网络爬虫了,这个例子主要实现用python爬虫从百度图库中下载美女的图片,并保存在本地,闲话少说,直接贴出相应的代码如下:---------------------------------
2023-01-31

如何使用Python网络爬虫实现起点小说下载

如何使用Python网络爬虫实现起点小说下载,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。今天要跟大家分享一个小说爬取案例--------起点小说的小说下载。在做这个案例之
2023-06-15

python爬虫学习笔记--BeautifulSoup4库的使用详解

目录使用范例常用的对象–Tag常用的对象–NavigableString常用的对象–BeautifulSoup常用的对象–Comment对文档树的遍历tag中包含多个字符串的情况.stripped_strings 去除空白内容搜索文档树–f
2022-06-10

使用Nodejs怎么编写一个定时爬虫

使用Nodejs怎么编写一个定时爬虫?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。const axios = require(axios)const roomid = "1
2023-06-09

python学习-Selenium爬虫之使用代理ip的方法

今天给大家分享的是如何在爬取数据的时候防止IP被封,今天给大家分享两种方法,希望大家可以认真学习,再也不用担心被封IP啦。第一种:降低访问速度,我们可以使用time模块中的sleep,使程序每运行一次后就睡眠1s,这样的话就可以大大的减少
2023-06-02

怎么在python中使用feapde实现一个爬虫

这篇文章给大家介绍怎么在python中使用feapde实现一个爬虫,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录