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

一起学爬虫——使用Beautiful Soup爬取网页!,第1张

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

要想学好爬虫,必须把基础打扎实,之前发布了两篇文章,分别是使用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 = '''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 BeautifulSoupHTML = '''   <p> href = "./test_beautifulsoup.HTML">test beautifulsoup link</p>     </body></html>'''soup = BeautifulSoup(HTML,'lxml')print(soup.find_all(name='Title',class_='Title_class'))</pre><p>css选择器:</p><p>BeautifulSoup还支持获取CSS元素,例如ul、div、li等元素。css选择器主要提供select()方法获取符合条件的节点(Tag对象),然后通过节点的get_text()方法和text属性可以获取该节点的文本值。</p><p>select方法还可以根据CSS的样式规则选择相应的节点:</p><pre>from bs4 import BeautifulSoupHTML = '''<html> <body> <Title ID="Title_ID"  name="Title name">Test BeautifulSoup 

href = "./test_beautifulsoup.HTML">test beautifulsoup link

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

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

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

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

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

soup.select(".article li")

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

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

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

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

蓝色框中是歌曲的名字、演唱者和播放次数,歌曲名是在的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首歌曲的演唱者和播放次数是在的p节点中:

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

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

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

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

代码整理后如下:

# Coding:utf-8from bs4 import BeautifulSoupimport requestsdef 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选择器获取的节点下面的所有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选择器来爬取一个网页。这三个选择器可以混合搭配使用。

总结

以上是内存溢出为你收集整理的一起学爬虫——使用Beautiful Soup爬取网页!全部内容,希望文章能够帮你解决一起学爬虫——使用Beautiful Soup爬取网页!所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1208462.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存