Python爬虫入门 ~ bs4基本使用

165 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情

简介

BeautifulSoup简称bs4,它和xml一样,是一个html的解析器,主要功能也是解析和提取数据,与xml相比,其优点是接口设计人性化,使用便捷,缺点则是没有lxml的效率高。

安装以及对象创建

1. 安装

pip install bs4

image.png

2. 导入

from bs4 import BeautifulSoup

3. 创建对象

# 服务器响应的文件生成对象
soup = BeautifulSoup(response.read().decode('utf-8'), 'lxml')

# 本地文件生成对象
soup = BeautifulSoup(open('xxx.html', encoding='utf-8'), 'lxml')

基本使用

案例页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>bs4Demo</title>
</head>
<body>
  <div>
    <ul>
        <li>
            <a id="a1" href="https://juejin.cn/">掘金-首页</a>
        </li>
    </ul>
  </div>
    <a id="a2" href="https://juejin.cn/pins" title="pins">掘金-沸点</a>
    <a href="https://juejin.cn/pins" title="pins" class="juejin">掘金-沸点</a>
    <span id="sp">SPAN标签</span>
</body>
</html>

1. 根据标签名查找节点

# 根据标签名查找节点(只匹配第一个节点)
print(soup.a)
# 获取标签的属性和属性值
print(soup.a.attrs)

image.png

2. 函数

find

# 相当于 soup.a,返回的是第一个符合条件的数据
print("a:", soup.find('a'))
# 根据 title的值,找到第一个符合条件的对象
print("title:", soup.find('a', title='pins'))
# 根据 class_的值,找到第一个符合条件的对象(class属性是python中的关键字,需要添加下划线区分)
print("class_:", soup.find('a', class_='juejin'))

image.png

find_all

# 返回所有 a 标签
print(soup.find_all('a'))
# 多标签查询需要传入一个列表参数
print(soup.find_all(['a', 'span']))
# 查询前N条数据
print(soup.find_all('a', limit=2))

image.png

select

# 查询所有指定的标签列表
print(soup.select('a'))
# 类选择器,通过 . 加上 class属性值查询符合条件的标签列表
print(soup.select('.juejin'))
# ID选择器,通过 # 加上 id属性值查询符合条件的标签列表
print(soup.select('#sp'))
# 属性选择器,查找到 a 标签中有id属性的标签
print(soup.select('a[id]'))
# 属性选择器,查找到 a 标签中有id属性且值为 a1 的标签
print(soup.select('a[id="a1"]'))
# 层级选择器,找到 div 标签下的 a 标签(后代选择器)
print(soup.select('div a'))
# 层级选择器,找到 div 标签下的 a 标签(子代选择器)
print(soup.select('div > a'))
print(soup.select('div > ul > li > a'))

image.png

3. 节点信息

演示页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>bs4Demo</title>
</head>
<body>
    <div id="a1">
          <span>
              掘金
          </span>
    </div>
    <p id="pid" class="p_class"></p>
</body>
</html>
from bs4 import BeautifulSoup

soup = BeautifulSoup(open('bs4_2.html', encoding='utf-8'), 'lxml')

# 节点信息
# 获取节点内容
# string 只能获取到标签中仅有纯文本的内容
print(soup.select('#a1')[0].string)
# get_text() 可以获取到标签中嵌套子标签中的数据
print(soup.select('#a1')[0].get_text())

# 获取节点的属性值
# 通过 attrs 获取到标签的属性,该类型为字典类型,可通过以下三种方式获取属性值
p = soup.select('#pid')[0]
print(p.attrs.get('class'))
print(p.get('class'))
print(p['class'])

image.png