• 15 Beautiful Soup(提取数据详解find_all())


    # 1、获取所有tr标签
    # 2、获取第2个tr标签
    # 3、获取所有class等于even的tr标签
    # 4_1、将所有id等于test,class也等于test的所有a标签提取出
    # 4_2、获取所有a标签下href属性的值
    # 5、获取所有的职位信息(纯文本)


    # 1、获取所有tr标签
     1 from bs4 import BeautifulSoup
     2 text = """
     3 <table class="tablelist" cellpadding="0" cellspacing="0">
     4     <tbody>
     5         <tr class="h">
     6             <td class="l" width="374">职位名称</td>
     7             <td>职位类别</td>
     8             <td>人数</td>
     9             <td>地点</td>
    10             <td>发布时间</td>
    11         </tr>
    12         <tr class="even">
    13             <td class="l square"><a target="blank"
    14 href="https://www.baidu.com/">研发工程师(上海1)</a></td>
    15             <td>技术类</td>
    16             <td>1</td>
    17             <td>上海</td>
    18             <td>2020-1-1</td>
    19         </tr>
    20         <tr class="odd">
    21             <td class="l square"><a target="blank"
    22 href="https://www.baidu.com/">工程师(北京2)</a></td>
    23             <td>技术类</td>
    24             <td>2</td>
    25             <td>北京</td>
    26             <td>2020-2-2</td>
    27         </tr>
    28         <tr class="even">
    29             <td class="l square"><a target="blank"
    30 href="https://www.baidu.com/">工程师(上饶3)</a></td>
    31             <td>管理类</td>
    32             <td>3</td>
    33             <td>上饶</td>
    34             <td>2020-3-3</td>
    35         </tr>
    36     </tbody>
    37 </table>
    38 """
    39 
    40 soup = BeautifulSoup(text, 'lxml')
    41 # 1、获取所有tr标签
    42 trs = soup.find_all('tr')
    43 for tr in trs:
    44     print(tr)
    45     print('='*30)
    # 2、获取第2个tr标签
    1 # 2、获取第2个tr标签
    2 # limit参数指限制多少个标签提取
    3 tr2 = soup.find_all('tr', limit=2)[1]
    4 print(tr2)
    # 3、获取所有class等于even的tr标签
    1 # 3、获取所有class等于even的tr标签
    2 # class为python关键字,后面加_加以区分
    3 trs = soup.find_all('tr', class_ = 'even')
    4 for tr in trs:
    5     print(tr)
    6     print('='*30)
    1 #方法二:
    2 trs = soup.find_all('tr', attrs={'class':'even'})
    3 for tr in trs:
    4     print(tr)
    5     print('='*30)
    # 4_1、将所有id等于test,class也等于test的所有a标签提取出
    # 4_1、将所有id等于test,class也等于test的所有a标签提取出
    # 方法一:
    alists1 = soup.find_all('a', attrs={'id':'test', 'class':'test'})
    print(alists1)
    # 方法二
    alists2 = soup.find_all('a', class_='test', id='test')
    print(alists2)
    # 4_2、获取所有a标签下href属性的值
    1 # 4_2、获取所有a标签下href属性的值
    2 ahs = soup.find_all('a')
    3 for ah in ahs:
    4     # 方法一:通过下标操作
    5     href1 = ah['href']
    6     print('href1={}'.format(href1))
    7     # 方法二:通过属性操作
    8     href2 = ah.attrs['href']
    9     print('href2={}'.format(href2))
    # 5、获取所有的职位信息(纯文本)
     1 # 5、获取所有的职位信息(纯文本)
     2 trs = soup.find_all('tr')[1:]   # 从第二个tr开始获取
     3 movies = []
     4 for tr in trs:
     5     movie = {}
     6     tds = tr.find_all('td')
     7     title = tds[0].string
     8     category = tds[1].string
     9     num = tds[2].string
    10     city = tds[3].string
    11     time = tds[4].string
    12     movie['title'] = title
    13     movie['category'] = category
    14     movie['num'] = num
    15     movie['city'] = city
    16     movie['time'] = time
    17     movies.append(movie)
    18 
    19 print(movies)
    # 5、获取所有的职位信息(纯文本)方法二:推荐
     1 trs = soup.find_all('tr')[1:]   # 从第二个tr开始获取
     2 movies = []
     3 for tr in trs:
     4     movie = {}
     5     # 获取tr下所有非标签字符
     6     # infos= list(tr.strings)
     7     # 获取tr下所有非标签&非空白字符
     8     infos = list(tr.stripped_strings)
     9     #print(infos)
    10     movie['title'] = infos[0]
    11     movie['category'] = infos[1]
    12     movie['num'] = infos[2]
    13     movie['city'] = infos[3]
    14     movie['time'] = infos[4]
    15     movies.append(movie)
    16 
    17 print(movies)

    附:关于string、strings、stripped_strings属性以及get_text()方法:

    string:      获取某个标签下的非标签字符串,返回值是一个字符串。

    strings:       获取某个标签下的子孙非标签字符串,返回值是一个生成器。

    stripped_strings:  获取某个标签下的子孙非标签字符串并去掉空白字符,返回值是一个生成器。

    get_text():       获取某个标签下的子孙非标签字符串,不是以列表的形式返回,是以普通字符串返回。

  • 相关阅读:
    a[::-1]相当于 a[-1:-len(a)-1:-1],也就是从最后一个元素到第一个元素复制一遍。
    +=
    map 和reduce
    赋值语句
    高阶函数
    函数式编程
    迭代器
    如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:
    ie11升级的过程中遇到的问题以及解决办法
    .csporj 文件部分节点解析
  • 原文地址:https://www.cnblogs.com/sruzzg/p/13092085.html
Copyright © 2020-2023  润新知