这里我们主要梳理下思路,整理下和
BeautifulSoup
有关的内容。
1、find和find_all
相同点
在提取数据的时候,第一个参数是标签的名字,如果后面还想有其他参数作为过滤的方式而存在,可以通过关键字的形式来传输,比如'class_'=red
,如果你的关键字不是python
关键字的话,后面是不可以添加下划线的,否则会无法筛选出来准确数据。
亦或者通过attrs
属性,可以将你想要用来过滤的相关内容添加进来,他是一个字典的形式;
不同点
find
:不管你这个文件中有多少个匹配的内容,他只返回第一个匹配到的内容,一旦匹配到,这个就结束了;
find_all
:匹配符合条件的所有数据并以列表的形式返回;
2、获取标签的属性
(2.1)通过下标获取
Jier = a['href']
(2.2)通过attrs
属性
Jier = a.attrs['href']
3、string、strings、stripped_strings、get_text方法
(3.1)string
方法
获取指定标签下的非标签字符串,返回来的是一个字符串,如果该标签下有多个非标签字符串,就无法获取到了;
可以看下,下面这个示例是只有一个非标签字符串:
Html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
<tbody>
<tr class="h">
<td class="l" width="374">职位名称</td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
</tbody>
</table>
"""
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find('td')
print(Suner.string)
运行结果如下:
职位名称
我们成功获取到了第一个td
标签下的非标签字符串;
下面我们试着在第一个td
标签中,再添加一个非标签字符串,看看是否可以获取到呢;
Html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
<tbody>
<tr class="h">
<td class="l" width="374">职位名称<p>你好</p></td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
</tbody>
</table>
"""
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find('td')
print(Suner.string)
运行结果如下:
None
可以看到我们获取了一个空值。
(3.2)strings
方法
获取某个标签下的所有子孙非标签字符串,返回来的是一个生成器;
如下:
Html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
<tbody>
<tr class="h">
<td class="l" width="374">职位名称<p>你好</p></td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
</tbody>
</table>
"""
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find('td')
Strs = list(Suner.strings)
print(Strs)
输出结果如下:
['职位名称', '你好']
或者有同学想获取所有的非标签字符串,如下:
Html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
<tbody>
<tr class="h">
<td class="l" width="374">职位名称<p>你好</p></td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
</tbody>
</table>
"""
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find('tr')
Strs = list(Suner.strings)
print(Strs)
运行结果如下:
['\n', '职位名称', '你好', '\n', '职位类别', '\n', '人数', '\n', '地点', '\n', '发布时间', '\n']
可以看到结果中有很多空字符串'\n'
,那么如何避免有这个空字符串呢,那就轮到我们的stripped_strings
方法了;
(3.3)stripped_strings
方法
获取某个标签下的所有子孙非标签字符串,并自动去掉空值,返回来的是一个生成器;
如下:
Html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
<tbody>
<tr class="h">
<td class="l" width="374">职位名称<p>你好</p></td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
</tbody>
</table>
"""
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find('tr')
Strs = list(Suner.stripped_strings)
print(Strs)
运行结果如下:
['职位名称', '你好', '职位类别', '人数', '地点', '发布时间']
(4)get_text
方法
获取某个标签下的所有子孙非标签字符串,并以字符串的形式返回,且可以指定字符串连接;
如果不指定字符串;
Html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
<tbody>
<tr class="h">
<td class="l" width="374">职位名称<p>你好</p></td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
</tbody>
</table>
"""
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find('tr')
Strs = Suner.get_text
print("我的类型是:" + str(type(Strs)))
print('-'*20)
print(Strs)
运行结果如下:
我的类型是:<class 'method'>
--------------------
<bound method PageElement.get_text of <tr class="h">
<td class="l" width="374">职位名称<p>你好</p></td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>>
可以看到他是返回了所有内容,当我们指定字符串呢,看看什么效果:
Html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
<tbody>
<tr class="h">
<td class="l" width="374">职位名称<p>你好</p></td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
</tbody>
</table>
"""
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find('tr')
Strs1 = Suner.get_text('*')
print("我指定了其他字符串之后的类型是:" + str(type(Strs1)))
print('-'*20)
print(Strs1)
Strs2 = Suner.get_text('')
print("我指定了空字符串之后的类型是:" + str(type(Strs2)))
print('-'*20)
print(Strs2)
运行结果如下:
我指定了其他字符串之后的类型是:<class 'str'>
--------------------
*职位名称*你好*
*职位类别*
*人数*
*地点*
*发布时间*
我指定了空字符串之后的类型是:<class 'str'>
--------------------
职位名称你好
职位类别
人数
地点
发布时间
那就有同学好奇了,那我筛选出来之后,为什么还要指定空字符串来做数据替换呢,有没有让他默认就是空字符串替换之后的数据展现呢,当然有了,那就是我们的text
方法了;
(3.5)text
方法
获取某个标签下的所有子孙非标签字符串,返回的是字符串;
Html = """
<table class="tablelist" cellpadding="0" cellspacing="0">
<tbody>
<tr class="h">
<td class="l" width="374">职位名称<p>你好</p></td>
<td>职位类别</td>
<td>人数</td>
<td>地点</td>
<td>发布时间</td>
</tr>
</tbody>
</table>
"""
from bs4 import BeautifulSoup
Jier = BeautifulSoup(Html, 'lxml')
Suner = Jier.find('tr')
Strs = Suner.text
print("我的类型是:" + str(type(Strs)))
print('-'*20)
print(Strs)
输出结果如下:
我的类型是:<class 'str'>
--------------------
职位名称你好
职位类别
人数
地点
发布时间
至此,本文结束,然后我们明天开始介绍最后一种python
常用的获取网页数据的方式,也是这三种里面最难的一种:正则。

往期推荐




