暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python爬虫-14-python获取数据之BeautifulSoup4库(下)

运维家 2022-05-26
736

这里我们主要梳理下思路,整理下和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="lwidth="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
常用的获取网页数据的方式,也是这三种里面最难的一种:正则。

 

长按以识别二维码关注运维家~
微信号:yunweijia0909


往期推荐

02-docker系列-镜像分类以及操作(导入、导出、删除)

05-docker系列-使用dockerfile构建镜像

01-docker系列-linux下的docker安装



文章转载自运维家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论