BeautifulSoup

#!/usr/bin/env python
# coding: utf-8

# In[3]:

from bs4 import BeautifulSoup


# # BeautifulSoup介绍
# 1、BeautifulSoup是基础HTML DOM的,会载入整个文档构建整个DOM树,因此时间和内存开销大,性能也就更低,而lxml只是进行局部的遍历
# 
# 2、BeautifulSoup只能读取字符串格式,不能从文件中读取
# 

# In[49]:


text = '''
<tr class="h">
                    <td class="l" width="374">职位名称</td>
                    <td>职位类别</td>
                    <td>人数</td>
                    <td>地点</td>
                    <td>发布时间</td>
                </tr>
                                <tr class="even">
                    <td class="l square" id='ceshi'><a target="_blank" href="position_detail.php?id=47281&amp;keywords=&amp;tid=87&amp;lid=0">PCG04-腾讯新闻高级Android开发工程师(北京)</a></td>
                    <td>技术类</td>
                    <td>1</td>
                    <td>北京</td>
                    <td>2019-01-23</td>
                </tr>
                                <tr class="odd">
                    <td class="l square"><a target="_blank" href="position_detail.php?id=47280&amp;keywords=&amp;tid=87&amp;lid=0">28603-113 微信支付智慧营销开发工程师(深圳)</a></td>
                    <td>技术类</td>
                    <td>1</td>
                    <td>深圳</td>
                    <td>2019-01-23</td>
                </tr>
                                <tr class="even">
                    <td class="l square"><a target="_blank" href="position_detail.php?id=47270&amp;keywords=&amp;tid=87&amp;lid=0">27020-量子实验室后台开发工程师(深圳)</a></td>
                    <td>技术类</td>
                    <td>2</td>
                    <td>深圳</td>
                    <td>2019-01-23</td>
                </tr>
                                <tr class="odd">
                    <td class="l square"><a target="_blank" href="position_detail.php?id=47263&amp;keywords=&amp;tid=87&amp;lid=0">22989-腾讯云售中交付技术总监(深圳)</a></td>
                    <td>技术类</td>
                    <td>1</td>
                    <td>深圳</td>
                    <td>2019-01-23</td>
                </tr>
                                <tr class="even">
                    <td class="l square"><a target="_blank" href="position_detail.php?id=47258&amp;keywords=&amp;tid=87&amp;lid=0">PCG04-测试开发工程师(北京)</a></td>
                    <td>技术类</td>
                    <td>1</td>
                    <td>北京</td>
                    <td>2019-01-23</td>
                </tr>
                                <tr class="odd">
                    <td class="l square"><a target="_blank" href="position_detail.php?id=47259&amp;keywords=&amp;tid=87&amp;lid=0">PCG04-AI评价优化高级工程师(深圳)</a></td>
                    <td>技术类</td>
                    <td>1</td>
                    <td>深圳</td>
                    <td>2019-01-23</td>
                </tr>
                                <tr class="even">
                    <td class="l square"><a target="_blank" href="position_detail.php?id=47260&amp;keywords=&amp;tid=87&amp;lid=0">PCG04-腾讯新闻高级后台开发工程师(北京)</a></td>
                    <td>技术类</td>
                    <td>1</td>
                    <td>北京</td>
                    <td>2019-01-23</td>
                </tr>
                                <tr class="odd">
                    <td class="l square"><a target="_blank" href="position_detail.php?id=47261&amp;keywords=&amp;tid=87&amp;lid=0">17757-前端开发工程师(北京)</a></td>
                    <td>技术类</td>
                    <td>1</td>
                    <td>北京</td>
                    <td>2019-01-23</td>
                </tr>
                                <tr class="even">
                    <td class="l square"><a target="_blank" href="position_detail.php?id=47262&amp;keywords=&amp;tid=87&amp;lid=0">30359-高级服务器开发工程师</a></td>
                    <td>技术类</td>
                    <td>1</td>
                    <td>深圳</td>
                    <td>2019-01-23</td>
                </tr>
                                <tr class="odd">
                    <td class="l square"><a target="_blank" href="position_detail.php?id=47252&amp;keywords=&amp;tid=87&amp;lid=0">25927-高级手游适配测试经理</a></td>
                    <td>技术类</td>
                    <td>1</td>
                    <td>上海</td>
                    <td>2019-01-23</td>
                </tr>
                                <tr class="f">
                    <td colspan="5">
                        <div class="left">共<span class="lightblue total">1424</span>个职位</div>
                        <div class="right"><div class="pagenav"><a href="javascript:;" class="noactive" id="prev">上一页</a><a class="active" href="javascript:;">1</a><a href="position.php?lid=&amp;tid=87&amp;keywords=请输入关键词&amp;start=10#a">2</a><a href="position.php?lid=&amp;tid=87&amp;keywords=请输入关键词&amp;start=20#a">3</a><a href="position.php?lid=&amp;tid=87&amp;keywords=请输入关键词&amp;start=30#a">4</a><a href="position.php?lid=&amp;tid=87&amp;keywords=请输入关键词&amp;start=40#a">5</a><a href="position.php?lid=&amp;tid=87&amp;keywords=请输入关键词&amp;start=50#a">6</a><a href="position.php?lid=&amp;tid=87&amp;keywords=请输入关键词&amp;start=60#a">7</a><a href="position.php?lid=&amp;tid=87&amp;keywords=请输入关键词&amp;start=70#a">...</a><a href="position.php?lid=&amp;tid=87&amp;keywords=请输入关键词&amp;start=1420#a">143</a><a href="position.php?lid=&amp;tid=87&amp;keywords=请输入关键词&amp;start=10#a" id="next">下一页</a><div class="clr"></div></div></div>
                        <div class="clr"></div>
                    </td>
'''


# In[29]:


# 建立一个BeautifulSoup对象,传入需要解析的字符串并且传入需要用那种进行解析
bs = BeautifulSoup(text,'lxml') 


# In[30]:


print(bs.prettify())   # 是html代码规范化,可以自动补全缺失的标签


# # bs4库的使用方法

# In[18]:


# 1、获取所有的td 标签
get_all_tds = bs.find_all('td')             #  返回的是一个列表类型
for get_all_td in get_all_tds:
    print(get_all_td)
    print('==='*30)


# In[21]:


# 2、获取第二个td标签
# 在find_all方法里面有个参数:limit ,如果你不想获取太多的数据的话可以使用这个参数,limit等于几就获取几个数据,我只想获取第二个数据
print(bs.find_all('td',limit=2)[1])


# In[23]:


# 3、获取所有class=‘l square’的td标签
get_squares = bs.find_all('td',class_='l square')
for square in get_squares:
    print(square)


# In[25]:


# 也可以用attrs来获取
get_squares = bs.find_all('td',attrs={'class':'l square'})
for square in get_squares:
    print(square)


# In[31]:


# 4、获取多个条件的字符串,比如:<td class="l square" id='ceshi'> 获取class= square   id = ceshi的td标签
get_squares = bs.find_all('td',class_='l square',id='ceshi')
for square in get_squares:
    print(square)


# In[32]:


# 也可以用attrs来获取
get_squares = bs.find_all('td',attrs={'class':'l square','id':'ceshi'})
for square in get_squares:
    print(square)


# In[34]:


#5、获取a标签中的href属性值
# 有两种方法,第一种:相对比较简单和方便
a_tag_lists = bs.find_all('a')
for a_tag_list in a_tag_lists:
    href = a_tag_list['href']
    print(href)


# In[35]:


# 第二种方法,利用attrs
a_tag_lists = bs.find_all('a')
for a_tag_list in a_tag_lists:
    href = a_tag_list.attrs['href']
    print(href)


# In[40]:


# 6、获取所有职位的信息(文本数据,不包含html代码)  你想获取所有的字符串,可以直接bs.strings,但是如果有空格的话
# 是不会剔除的,bs.stripped_strings获取所有字符串的时候可以剔除空格
mess_lists = bs.find_all('td')
print(mess_lists[0].string)
# for mess_list in mess_lists:
#     print(mess_list.string)
#     print('---'*30)


# ## 总结

# #### find_all的使用方法:
# 1、在提取标签的时候,第一个参数是标签的名字,然后想通过标签属性进行过滤的时候,可以在这个方法中通过关键字参数的
# 形式,将属性值的名字和对应的字传入进去,或者使用attrs属性,将所有的属性和值以字典的形式传入进去
# 
# 2、不想提取太多数据的时候可以用limit参数限制提取多少个
# 

 

posted @ 2019-01-23 22:49  睚一  阅读(183)  评论(0编辑  收藏  举报