原 

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




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

python Beautifulsoup 数据有乱码 python beautifulsoup find_all_字符串



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. 
    2. soup.find_all([u]id[/u]='link2')
    3. # [<a class="sister" href="http://example.com/lacie"[u] id[/u]="link2">Lacie</a>]
    4. 如果传入 href 参数,Beautiful Soup会搜索每个tag的”href”属性:
    5. 
    6. 搜索指定名字的属性时可以使用的参数值包括 字符串 , 正则表达式 , 列表, True .
    7. 
    8. 来段代码:
    9. [code]from bs4 import BeautifulSoup as bs
    10. html = '''<table border=16 width='66%' align='center'>
    11.                 <thead align='center'>
    12.                         <caption>鱼C信息</caption>
    13.                         <tr>
    14.                                 <td colspan="3">鱼C信息表</td>
    15.                         </tr>
    16.                         <tr>
    17.                                 <th id='th1'>姓名</th>
    18.                                 <th id='th2'>年龄</th>
    19.                                 <th id='th3'>颜值</th>
    20.                         </tr>
    21.                 </thead>
    22.                 <tbody align='center'>
    23.                         <tr>
    24.                                 <td>不二如是:</td>
    25.                                 <td>18</td>
    26.                                 <td>下一位更帅~</td>
    27.                         </tr>
    28.                         <tr>
    29.                                 <td>小甲鱼老湿:</td>
    30.                                 <td>28</td>
    31.                                 <td>下一位更帅~</td>
    32.                         </tr>
    33.                         <tr>
    34.                                 <td>MSK:</td>
    35.                                 <td>16</td>
    36.                                 <td>第一位最帅~</td>
    37.                         </tr>
    38.                         <tr>
    39.                                 <td colspan='3'>村里有个姑娘叫小花~</td>
    40.                         </tr>
    41.                 </tbody>        
    42.         </table>'''
    43. 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一样,但是最多只返回一个结果