鱼C论坛

 找回密码
 立即注册
查看: 24863|回复: 1

[技术交流] python爬虫进阶BeautifulSoup 超详细的find_all()和find

[复制链接]
发表于 2017-7-10 21:56:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 MSK 于 2017-7-10 21:58 编辑

超详细的find_all()和find
推荐阅读:BeautifulSoup节点


在之前的帖子里我们已经使用过了find_all,不过对于find_all,有的东西还得说明一下


这就是find_all和find,别急,我们慢慢来,熟练掌握find_all和find,对你写爬虫将大有帮助!

find_all( name , attrs , recursive , text , **kwargs )

find( name , attrs , recursive , text , **kwargs )



name 参数
name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉.

简单的用法如下:

  1. soup.find_all("title")
  2. # [<title>The Dormouse's story</title>]
复制代码




keyword 参数
如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性.

  1. soup.find_all([u]id[/u]='link2')
  2. # [<a class="sister" href="http://example.com/lacie"[u] id[/u]="link2">Lacie</a>]
  3. 如果传入 href 参数,Beautiful Soup会搜索每个tag的”href”属性:

  4. 搜索指定名字的属性时可以使用的参数值包括 字符串 , 正则表达式 , 列表, True .

  5. 来段代码:
  6. [code]from bs4 import BeautifulSoup as bs
  7. html = '''<table border=16 width='66%' align='center'>
  8.                 <thead align='center'>
  9.                         <caption>鱼C信息</caption>
  10.                         <tr>
  11.                                 <td colspan="3">鱼C信息表</td>
  12.                         </tr>
  13.                         <tr>
  14.                                 <th id='th1'>姓名</th>
  15.                                 <th id='th2'>年龄</th>
  16.                                 <th id='th3'>颜值</th>
  17.                         </tr>
  18.                 </thead>
  19.                 <tbody align='center'>
  20.                         <tr>
  21.                                 <td>不二如是:</td>
  22.                                 <td>18</td>
  23.                                 <td>下一位更帅~</td>
  24.                         </tr>
  25.                         <tr>
  26.                                 <td>小甲鱼老湿:</td>
  27.                                 <td>28</td>
  28.                                 <td>下一位更帅~</td>
  29.                         </tr>
  30.                         <tr>
  31.                                 <td>MSK:</td>
  32.                                 <td>16</td>
  33.                                 <td>第一位最帅~</td>
  34.                         </tr>
  35.                         <tr>
  36.                                 <td colspan='3'>村里有个姑娘叫小花~</td>
  37.                         </tr>
  38.                 </tbody>       
  39.         </table>'''
  40. soup = bs(html,'html.parser')
复制代码


ps:在这段代码中,只有<th>标签拥有id

当name传入字符串(a)时,将会查找所有name属性为a的Tag
  1. temp = soup.find_all('tr')
  2. temp
  3. #[<tr>
  4. <td colspan="3">鱼C信息表</td>
  5. </tr>, <tr>
  6. <th id="th1">姓名</th>
  7. <th id="th2">年龄</th>
  8. <th id="th3">颜值</th>
  9. </tr>, <tr>
  10. <td>不二如是:</td>
  11. <td>18</td>
  12. <td>下一位更帅~</td>
  13. </tr>, <tr>
  14. <td>小甲鱼老湿:</td>
  15. <td>28</td>
  16. <td>下一位更帅~</td>
  17. </tr>, <tr>
  18. <td>MSK:</td>
  19. <td>16</td>
  20. <td>第一位最帅~</td>
  21. </tr>, <tr>
  22. <td colspan="3">村里有个姑娘叫小花~</td>
  23. </tr>]
复制代码


传入正则表达式时re.compile('a'),将查找所有包含'a'的Tag
  1. soup.find_all([u]href[/u]=re.compile("elsie"))
  2. # [<a class="sister" [u]href[/u]="http://example.com/elsie" id="link1">Elsie</a>]
复制代码


传入列表时,将查找所有包含列表中元素的Tag
  1. soup.find_all(['th','td'])
  2. [<td colspan="3">鱼C信息表</td>, <th id="th1">姓名</th>, <th id="th2">年龄</th>, <th id="th3">颜值</th>, <td>不二如是:</td>, <td>18</td>, <td>下一位更帅~</td>, <td>小甲鱼老湿:</td>, <td>28</td>, <td>下一位更帅~</td>, <td>MSK:</td>, <td>16</td>, <td>第一位最帅~</td>, <td colspan="3">村里有个姑娘叫小花~</td>]
复制代码


传入True时,我不会解释,你自己看:
  1. soup.find_all(id=True)
  2. [<th id="th1">姓名</th>, <th id="th2">年龄</th>, <th id="th3">颜值</th>]
复制代码

将所有具有id属性的Tag查找了出来


text参数
通过 text 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True
  1. soup.find_all(text='下一位更帅~')
  2. #['下一位更帅~', '下一位更帅~']
  3. soup.find_all(text=re.compile('帅'))
  4. #['下一位更帅~', '下一位更帅~', '第一位最帅~']
  5. soup.find_all(text=True)
  6. #['\n', '\n', '鱼C信息', '\n', '\n', '鱼C信息表', '\n', '\n', '\n', '姓名', '\n', '年龄', '\n', '颜值', '\n', '\n', '\n', '\n', '\n', '不二如是:', '\n', '18', '\n', '下一位更帅~', '\n', '\n', '\n', '小甲鱼老湿:', '\n', '28', '\n', '下一位更帅~', '\n', '\n', '\n', 'MSK:', '\n', '16', '\n', '第一位最帅~', '\n', '\n', '\n', '村里有个姑娘叫小花~', '\n', '\n', '\n']
复制代码



limit 参数
限制返回个数

recursive 参数
指定为True时,搜索范围是子孙节点,如果设为False,只搜索子节点





                               
登录/注册后可看大图




find的参数和用法和find_all一样,但是最多只返回一个结果



评分

参与人数 2荣誉 +6 鱼币 +9 收起 理由
康小泡 + 3
小甲鱼 + 6 + 6 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-18 21:54:21 | 显示全部楼层
这个[u] [\u]是啥意思啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 17:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表