爬虫数据-Beautiful Soup

安装
pip intsall bs4

Beautiful Soup的简介
Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据,官方解释如下:

  • Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
  • Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
  • Beautiful Soup已成为和lxml一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

GitHub地址

和lxml一样,BeautifulSoup也是一个HTML/XML的解析器,主要功能也是如何解析和提取HTML/XML数据

抓取工具 速度 使用难度
正则 最快 使用困难
lxml 简单
BeautifulSoup 最简单

当我们的html代码不完整的时候,我们这时候就会需要使用Beautiful, Beautiful会自动帮我们补全html的代码所缺失的结构
prettify : 将html代码进行漂亮的打印

# -*- coding: utf-8 -*-
# @Time : 2020/2/5 12:37 
# @Author : 大数据小J


# 导入
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.prettify())

运行结果:

<html>
 <head>
  <title>
   The Dormouse's story
  </title>
 </head>
 <body>
  <p class="title">
   <b>
    The Dormouse's story
   </b>
  </p>
  <p class="story">
   Once upon a time there were three little sisters; and their names were
   <a class="sister" href="http://example.com/elsie" id="link1">
    Elsie
   </a>
   ,
   <a class="sister" href="http://example.com/lacie" id="link2">
    Lacie
   </a>
   and
   <a class="sister" href="http://example.com/tillie" id="link3">
    Tillie
   </a>
   ;
and they lived at the bottom of a well.
  </p>
  <p class="story">
   ...
  </p>
 </body>
</html>

BeautifulSoup
find : 查找的是第一个标签
attrs={} :里面传入的字典,属性对应值

find_all: 查找的所有的标签
attrs={} :里面传入的字典,属性对应值

string: 返回一个子节点内容
strings: 返回多条数据的内容(但包括换行符以及数据)
stripped_strings: 返回多条数据内容(返回的结果为纯文本数据)

# -*- coding: utf-8 -*- 
# @Time : 2020/2/4 22:23 
# @Author : 大数据小J
from bs4 import BeautifulSoup

html_doc = """
<table class="tablelist" cellspacing="0" cellpadding="0">
    <tbody>
        <tr class="h">
            <td class="1" width="374">职位名称</td>
            <td>职位类别</td>
            <td>人数</td>
            <td>地点</td>
            <td>发布时间</td>
        </tr>
        <tr class="even">
            <td class="l"><a href="https://www.baidu.com">区块链高级研发工程师</a></td>
            <td class="l">技术类</td>
            <td class="l">1</td>
            <td class="l">深圳</td>
            <td class="l">2018-11-25</td>
        </tr>
        <tr>
            <td><a href="https://www.qq.com">金融云高级后台开发</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2018-11-24</td>
        </tr>
        <tr>
            <td><a href="https://www.result.com">高级研发工程师</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2018-11-24</td>
        </tr>
        <tr>
            <td><a href="https://www.python.com">高级图像算法工程师</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2018-11-24</td>
        </tr>
        <tr>
            <td><a href="https://www.lg.com" id="test" class="test">高级业务运维工程师</a></td>
            <td>技术类</td>
            <td>2</td>
            <td>深圳</td>
            <td>2018-11-24</td>
        </tr>
    </tbody>
</table>
"""
soup = BeautifulSoup(html_doc, 'lxml')

# 1.获取所有tr标签
data = soup.find_all('tr')    # 查找所有的tr标签

# 2.获取第2个tr标签
data2 = soup.find_all('tr')[1]

# 3.获取所有class等于even的tr标签
data3 = soup.find_all('tr', attrs={'class': 'even'})

# 4.获取所有的a标签的href属性
data4s = soup.find_all('a')[1:]
for data4 in data4s:
    print(data4.get('href'))

# 5.获取所有的职位信息(纯文本)
data5s = soup.find_all('tr')
for data5 in data5s[1:]:
    print(list(data5.strings))

BeautifulSoup4四大对象种类
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

遍历文档树
contents和children

  • contents返回所有子节点的列表
  • children返回所有子节点的迭代器
发布了54 篇原创文章 · 获赞 26 · 访问量 6167

猜你喜欢

转载自blog.csdn.net/qq_37662827/article/details/104183441