爬虫利器BeautifulSoup中find和find_all的使用方法
二话不说,先上段HTML例子
<html> <head> <title> index </title> </head> <body> <div> <ul> <li id="flask"class="item-0"><a href="link1.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >first item</a></li> <li class="item-1"><a href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >second item</a></li> <li class="item-inactie"><a href="link3.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >third item</a></li> <li class="item-1"><a href="link4.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fourth item</a></li> <li class="item-0"><a href="link5.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fifth item</a> </ul> </div> <li> hello world </li> </body> </html>
使用BeautifulSoup前需要先构建BeautifulSoup实例
# 构建beautifulsoup实例 soup = BeautifulSoup(html,'lxml') # 第一个参数是要匹配的内容 # 第二个参数是beautifulsoup要采用的模块,即规则
需要注意的是,导入对的模块需要事先安装,此处导入的LXML事先已经安装。可以导入的模块可通过查询BeautifulSoup的文档查看
接下来是find和find_all的介绍
1. find
只返回第一个匹配到的对象
语法:
find(name, attrs, recursive, text, **wargs) # recursive 递归的,循环的
参数:
参数名
作用
name
查找标签
text
查找文本
attrs
基于attrs参数
例子:
# find查找一次 li = soup.find('li') print('find_li:',li) print('li.text(返回标签的内容):',li.text) print('li.attrs(返回标签的属性):',li.attrs) print('li.string(返回标签内容为字符串):',li.string)
运行结果:
find_li: <li class="item-0" id="flask"><a href="link1.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >first item</a></li>
li.text(返回标签的内容): first item
li.attrs(返回标签的属性): {'id': 'flask', 'class': ['item-0']}
li.string(返回标签内容为字符串): first item
find也可以通过‘属性=值'的方法进行匹配
li = soup.find(id = 'flask') print(li,'\n')
<li class="item-0" id="flask"><a href="link1.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >first item</a></li>
需要注意的是,因为class是python的保留关键字,若要匹配标签内class的属性,需要特殊的方法,有以下两种:
- 在attrs属性用字典的方式进行参数传递
- BeautifulSoup自带的特别关键字class_
# 第一种:在attrs属性用字典进行传递参数 find_class = soup.find(attrs={'class':'item-1'}) print('findclass:',find_class,'\n') # 第二种:BeautifulSoup中的特别关键字参数class_ beautifulsoup_class_ = soup.find(class_ = 'item-1') print('BeautifulSoup_class_:',beautifulsoup_class_,'\n')
运行结果
findclass: <li class="item-1"><a href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >second item</a></li>
BeautifulSoup_class_: <li class="item-1"><a href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >second item</a></li>
2. find_all
返回所有匹配到的结果,区别于find(find只返回查找到的第一个结果)
语法:
find_all(name, attrs, recursive, text, limit, **kwargs)
参数名
作用
name
查找标签
text
查找文本
attrs
基于attrs参数
与find一样的语法
上代码
# find_all 查找所有 li_all = soup.find_all('li') for li_all in li_all: print('---') print('匹配到的li:',li_all) print('li的内容:',li_all.text) print('li的属性:',li_all.attrs)
运行结果:
---
匹配到的li: <li class="item-0" id="flask"><a href="link1.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >first item</a></li>
li的内容: first item
li的属性: {'id': 'flask', 'class': ['item-0']}
---
匹配到的li: <li class="item-1"><a href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >second item</a></li>
li的内容: second item
li的属性: {'class': ['item-1']}
---
匹配到的li: <li cvlass="item-inactie"><a href="link3.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >third item</a></li>
li的内容: third item
li的属性: {'cvlass': 'item-inactie'}
---
匹配到的li: <li class="item-1"><a href="link4.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fourth item</a></li>
li的内容: fourth item
li的属性: {'class': ['item-1']}
---
匹配到的li: <li class="item-0"><a href="link5.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fifth item</a>
</li>
li的内容: fifth item
附上比较灵活的find_all查询方法:
# 最灵活的使用方式 li_quick = soup.find_all(attrs={'class':'item-1'}) for li_quick in li_quick: print('最灵活的查找方法:',li_quick)
运行结果:
- 最灵活的查找方法: <li class="item-1"><a href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >second item</a></li>
- 最灵活的查找方法: <li class="item-1"><a href="link4.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fourth item</a></li>
完整代码:
# coding=utf8 # @Author= CaiJunxuan # @QQ=469590490 # @Wechat:15916454524 # beautifulsoup # 导入beautifulsoup模块 from bs4 import BeautifulSoup # HTML例子 html = ''' <html> <head> <title> index </title> </head> <body> <div> <ul> <li id="flask"class="item-0"><a href="link1.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >first item</a></li> <li class="item-1"><a href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >second item</a></li> <li cvlass="item-inactie"><a href="link3.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >third item</a></li> <li class="item-1"><a href="link4.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fourth item</a></li> <li class="item-0"><a href="link5.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" >fifth item</a> </ul> </div> <li> hello world </li> </body> </html> ''' # 构建beautifulsoup实例 soup = BeautifulSoup(html,'lxml') # 第一个参数是要匹配的内容 # 第二个参数是beautifulsoup要采用的模块,即规则 # html.parser是python内置的结构匹配方法,但是效率不如lxml所以不常用 # lxml 采用lxml模块 # html5lib,该模块可以将内容转换成html5对象 # 若想要以上功能,就需要具备对应的模块,比如使用lxml就要安装lxml # 在bs4当中有很多种匹配方法,但常用有两种: # find查找一次 li = soup.find('li') print('find_li:',li) print('li.text(返回标签的内容):',li.text) print('li.attrs(返回标签的属性):',li.attrs) print('li.string(返回标签内容为字符串):',li.string) print(50*'*','\n') # find可以通过'属性 = 值'的方法进行select li = soup.find(id = 'flask') print(li,'\n') # 因为class是python的保留关键字,所以无法直接查找class这个关键字 # 有两种方法可以进行class属性查询 # 第一种:在attrs属性用字典进行传递参数 find_class = soup.find(attrs={'class':'item-1'}) print('findclass:',find_class,'\n') # 第二种:BeautifulSoup中的特别关键字参数class_ beautifulsoup_class_ = soup.find(class_ = 'item-1') print('BeautifulSoup_class_:',beautifulsoup_class_,'\n') # find_all 查找所有 li_all = soup.find_all('li') for li_all in li_all: print('---') print('匹配到的li:',li_all) print('li的内容:',li_all.text) print('li的属性:',li_all.attrs) # 最灵活的使用方式 li_quick = soup.find_all(attrs={'class':'item-1'}) for li_quick in li_quick: print('最灵活的查找方法:',li_quick)
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]