介绍一个非常简单的,常用的数据提取库,BeautifulSoup来提取想要的数据
以腾讯社招为例,下面是从腾讯社招爬下来的html页面
用这个页面来理解BeautufulSoup的提取规则和基本常用方法
html = """
<tbody><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"><a target="_blank" href="position_detail.php?id=48398&keywords=&tid=87&lid=0">CSIG16-车联网架构师(深圳)</a></td>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2019-03-11</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=48393&keywords=&tid=87&lid=0">CSIG16-车联网系统工程师(自研基础产品运维负责人)(上海)</a></td>
<td>技术类</td>
<td>1</td>
<td>上海</td>
<td>2019-03-11</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=48394&keywords=&tid=87&lid=0">CSIG16-车联网IT运维经理(上海)</a></td>
<td>技术类</td>
<td>1</td>
<td>上海</td>
<td>2019-03-11</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=48390&keywords=&tid=87&lid=0">CSIG17-云行业产品测试leader</a></td>
<td>技术类</td>
<td>1</td>
<td>深圳</td>
<td>2019-03-11</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=48392&keywords=&tid=87&lid=0">CSIG15-自然语言处理工程师(北京)</a></td>
<td>技术类</td>
<td>1</td>
<td>北京</td>
<td>2019-03-11</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=48384&keywords=&tid=87&lid=0">15575-《王者荣耀》图形渲染开发工程师(成都)</a></td>
<td>技术类</td>
<td>2</td>
<td>成都</td>
<td>2019-03-11</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=48382&keywords=&tid=87&lid=0">25664-政务应用架构师(深圳)</a></td>
<td>技术类</td>
<td>3</td>
<td>深圳</td>
<td>2019-03-11</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=48378&keywords=&tid=87&lid=0">22989-腾讯云容器技术高级工程师(北京)</a></td>
<td>技术类</td>
<td>1</td>
<td>北京</td>
<td>2019-03-11</td>
</tr>
<tr class="even">
<td class="l square"><a target="_blank" href="position_detail.php?id=48379&keywords=&tid=87&lid=0">22989-腾讯云-区域交付leader(北京)</a></td>
<td>技术类</td>
<td>1</td>
<td>北京</td>
<td>2019-03-11</td>
</tr>
<tr class="odd">
<td class="l square"><a target="_blank" href="position_detail.php?id=48380&keywords=&tid=87&lid=0">22989-腾讯云-区域交付leader(上海)</a></td>
<td>技术类</td>
<td>1</td>
<td>上海</td>
<td>2019-03-11</td>
</tr>
</tbody>
"""
首先导入BeautifulSoup库
然后把html用“lxml”的方法解析并赋值给soup
from bs4 import BeautifulSoup
soup = BeautifulSoup(html , "lxml")
一:找到所有的tr标签
用find_all()方法,用该方法找到html中的所有tr标签
trs = soup.find_all("tr")
for tr in trs:
print(tr)
因为tr标签内的内容较多,此处不再放运行结果,该方法返回一个数组类型,遍历这个数组就可以拿到所有tr标签,当需要某一个指定的tr标签是,用下标的方式即可
二:获取所有class等于even的标签
trs = soup.find_all("tr" , class_='even')
trs = soup.find_all("tr" , attrs={"class": "even"})
for tr in trs:
print(tr)
这里给出两种方法,第一种class_="even",第二种是用attrs定义字典的方法,attrs是参数
应该注意,class在python中是关键字,因此,在python中用class_来区分于class
这是我们获取到的其中一个
当对提取内容有多种条件时,比如,我们想要提取class为test和id为test的a标签,可以这样做
aList = soup.find_all("a" , id="test" , class_="test")
三:获取标签内的属性:
有时候标签内的属性,比如链接也是重要信息
以提取a标签内的href属性为例
aList = soup.find_all("a")
for a in aList:
href = a["href"]
print(href)
加上域名,就可以看见岗位更详细的信息
四:提取文本
如果想要更直观的看见这些岗位的信息,那么清晰易懂的文本更受欢迎,我们这样
trs = soup.find_all("tr")[1:]
positions = []
for tr in trs:
position = {}
infos = list(tr.stripped_strings)
position['职位'] = infos[0]
position['类别'] = infos[1]
position['人数'] = infos[2]
position['位置'] = infos[3]
position['发布时间'] = infos[4]
positions.append(position)
for position in positions:
for key,value in position.items():
print(key + ": " + value)
print("*"*30)
截取部分效果图,每一个学习爬虫的同学,必备的技能之一是会分析网页,看见自己想要的数据在哪,才能更快更好的拿到它。
如果哪里没看懂,不妨仔细分析html页面在多做思考。
这里只是BeautifulSoup的皮毛,记录学习,每天多一点。