当前位置: 首页 > news >正文

Python爬虫——BeautifulSoup的基本使用

Python爬虫——BeautifulSoup的基本使用

  • 安装beautifulsoup4模块
pip install beautifulsoup4

1.创建BeautifulSoup对象

import bs4
import requests

url = "http://www.baidu.com"
htmlFile = requests.get(url)  # 获取网页内容
# apparent_encoding获取网页编码方式,自动识别网页编码
htmlFile.encoding = htmlFile.apparent_encoding
# 创建BeautifulSoup对象,使用lxml的方式解析HTML内容
objSoup = bs4.BeautifulSoup(htmlFile.text, 'lxml')
# print(objSoup)
print(type(objSoup))  # <class 'bs4.BeautifulSoup'>

1.2内容解析

  • BeautifulSoup对象.标签名:返回标签首次出现的内容
# objSoup.tagName 返回标签首次出现的内容
# 1.获取网页标题--<title>标签里面的内容
title = objSoup.title
print(title)  # <title>百度一下,你就知道</title>

# text属性获取标签文本内容
print(objSoup.title.text)  # 百度一下,你就知道
  • find()函数:返回HTML文件中第一次出现的标签内容。也可以用于查找某个有特定属性的标签。
# objSoup.find('tagName')
# find()函数可以查找HTML文件内第一个符合的标签内容
# 1.返回标签第一次出现的内容
first_a = objSoup.find('a')
print(first_a)
# <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
# 2.属性定位
# 查询class属性,需要使用class_
findById = objSoup.find('a', class_='mnav')
print(findById)
# <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
# 使用attrs参数
find_attrs = objSoup.find(attrs={'class': 'mnav'})
print(find_attrs)
# <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
  • find_all():查找HTML中所有符合的标签内容,返回列表。
# find_all():查找HTML中所有符合的标签内容,返回列表
# 1.传入单个指定标签
list_a = objSoup.find_all('a')    # a标签的所有内容
print(list_a)
for a in list_a:
    print(a.text)
    # 新闻
    # hao123
    # 地图
    # 视频
    # 贴吧
    # 登录
    # 更多产品
    # 关于百度
    # About Baidu
    # 使用百度前必读
    # 意见反馈
# getText()获取元素内容
for i in range(len(list_a)):
    print(list_a[i].getText)
# 2.传入多个标签
list2 = objSoup.find_all(['div', 'a'])
print(list2)
print(len(list2))
# 3.传入正则表达式
import re
list3 = objSoup.find_all(re.compile('^a'))  # 查找全部以a开头的标签
print(list3)
list4 = objSoup.find_all(re.compile('^li'))  # 查找全部以li开头的标签
print(list4)
  • select()
    select()主要是以CSS选择器(selector)的方式寻找元素。如果找到元素,则返回元素列表;否则返回空列表。
    • 标签选择器:直接指定标签名
      • objSoup.select(‘p’):寻找所有<p>标签的元素;
      • objSoup.select(‘img’):寻找所有<img>标签的元素
      • objSoup.select(‘input[name]’):寻找所有<input>标签且包含name属性的元素;
    • 类(class)选择器:.
      • objSoup.select('.name):寻找所有class属性为name的元素;
    • id选择器:#
      • objSoup.select('#name):寻找所有id属性为name的元素;
    • 层级选择器:
      • 单层:>
        • objSoup.select(‘div.list > ul > li > a’):查找所有class为list的div中的ul里的li标签里面的a标签;
      • 多层:空格
        • objSoup.select(‘p #name’):寻找所有<p>标签且id为name的元素
        • objSoup.select(‘p .name’):寻找所有class为name的<p>标签;
# select()
# 1.标签选择器:直接指定标签名
list5 = objSoup.select('p')
print(list5)
# 2.类(class)选择器:.
list6 = objSoup.select('.mnav')
print(list6)
# 3.id选择器:#
list7 = objSoup.select('#lh')
print(list7)
# [<p id="lh"> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> </p>]

# 层级选择器
list8 = objSoup.select('#lh a')
print(list8)
# [<a href="http://home.baidu.com">关于百度</a>, <a href="http://ir.baidu.com">About Baidu</a>]
  • 获取标签文本内容
    • text:获取标签下的全部文本内容
    • get_text():获取标签下的全部文本内容
    • string:只能获取到标签下的直系文本内容
    • get()获取标签属性:如:a.get(‘href’)
  • 获取标签属性值
    • 通过选择器获取,如:
      • objSoup.select(‘#lh a’)[0].get(‘href’)
      • objSoup.select(‘#lh a’)[0][‘href’]
    • find()函数获取:
      • objSoup.find(‘a’)[‘href’]
    • 通过find_all方法获取:
      • objSoup.find_all(‘a’)[2][‘href’]
# 获取标签文本内容
# 1.text
text = objSoup.select('#lh a')[0].text
print(text)  # 关于百度

# 2.string
str1 = objSoup.select('#lh a')[0].string
print(str1)  # 关于百度

# 3.get_text()
text2 = objSoup.select('#lh a')[0].get_text()
print(text2)  # 关于百度

# 使用get()获取标签中的属性
href = objSoup.select('#lh a')[0].get('href')
print(href)  # http://home.baidu.com

first_a = objSoup.find('a')['href']
print(first_a)  # http://news.baidu.com
list_a = objSoup.find_all('a')[2]
print(list_a['href'])  # http://map.baidu.com

参考:

  • https://baijiahao.baidu.com/s?id=1703234898700447231
  • https://www.wangt.cc/2022/01/%E6%95%B0%E6%8D%AE%E8%A7%A3%E6%9E%90%E4%B9%8Bbs4/

相关文章:

  • Acwing 802. 区间和
  • 传统方式连接数据库的弊端和数据库连接池原理
  • 什么叫 “雪碧图”?
  • 公众号网课搜题题库使用方法
  • Excel中身份证号码相关操作详解
  • 如何用4行 C 代码实现一个跨平台的命令行 mp3 播放器
  • ES 查询用法
  • golang泛型
  • 如何快速安装JDK 1.8 以及配置环境变量
  • DataGrip 如何导出和恢复整个数据库数据,使用单个 SQL 文件
  • 基于SpringBoot+MyBatisPlus+DynamicDatasource+mysql的多数据源本地事务方案
  • 计算机毕业设计ssm+vue基本微信的健康食谱交流 论坛小程序
  • 天龙八部科举答题问题和答案(全5/8)
  • Python Matplotlib库:基本绘图补充
  • 类与对象(下)
  • 【node学习】协程
  • 【RocksDB】TransactionDB源码分析
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES6简单总结(搭配简单的讲解和小案例)
  • Java-详解HashMap
  • JS学习笔记——闭包
  • node入门
  • spring security oauth2 password授权模式
  • Spring-boot 启动时碰到的错误
  • 初探 Vue 生命周期和钩子函数
  • 和 || 运算
  • 聊聊directory traversal attack
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 在weex里面使用chart图表
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #宝哥教你#查看jquery绑定的事件函数
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (7)STL算法之交换赋值
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (poj1.2.1)1970(筛选法模拟)
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)pulsar安装在独立的docker中,python测试
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (分布式缓存)Redis分片集群
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)Unity3DUnity3D在android下调试
  • ***监测系统的构建(chkrootkit )
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net 简单实现MD5
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET和.COM和.CN域名区别
  • .net生成的类,跨工程调用显示注释
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [ 转载 ] SharePoint 资料
  • [17]JAVAEE-HTTP协议
  • [Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb