python3爬虫学习之数据提取之beautifulsoup

介绍一个非常简单的,常用的数据提取库,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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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&amp;keywords=&amp;tid=87&amp;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的皮毛,记录学习,每天多一点。

猜你喜欢

转载自blog.csdn.net/s_kangkang_A/article/details/88980754
今日推荐