#!/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&keywords=&tid=87&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&keywords=&tid=87&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&keywords=&tid=87&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&keywords=&tid=87&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&keywords=&tid=87&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&keywords=&tid=87&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&keywords=&tid=87&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&keywords=&tid=87&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&keywords=&tid=87&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&keywords=&tid=87&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=&tid=87&keywords=请输入关键词&start=10#a">2</a><a href="position.php?lid=&tid=87&keywords=请输入关键词&start=20#a">3</a><a href="position.php?lid=&tid=87&keywords=请输入关键词&start=30#a">4</a><a href="position.php?lid=&tid=87&keywords=请输入关键词&start=40#a">5</a><a href="position.php?lid=&tid=87&keywords=请输入关键词&start=50#a">6</a><a href="position.php?lid=&tid=87&keywords=请输入关键词&start=60#a">7</a><a href="position.php?lid=&tid=87&keywords=请输入关键词&start=70#a">...</a><a href="position.php?lid=&tid=87&keywords=请输入关键词&start=1420#a">143</a><a href="position.php?lid=&tid=87&keywords=请输入关键词&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参数限制提取多少个
#