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

python爬虫bs4库的用法

导入

        导入bs4之前先装两个库,bs4和lxml

pip install beautifulsoup4
pip install lxml

        lxml安装后可以显著提高执行速度。

        导入bs4

from bs4 import BeautifulSoup

解析字符串

        BeautifulSoup()方法用于解析字符串,将字符串解析为soup对象,soup对象可以实现识别浏览器标签等功能。

        该方法有两个参数,第一个是要解析的字符串,第二个是要使用的解析器。省略第二个参数后如果安装了lxml则默认为lxml,没安装则html.parser。lxml的速度明显高于html.parser,同时兼容性更佳。

soup = BeautifulSoup(html,"lxml")

获取节点

        解析完字符串后就可以获取标签了,可以使用find,findall,select方法。

        也可以直接用点调用标签名,这种用法同find方法。

find方法值返回查找到的第一个属性,有四个参数

        soup.find(tag, attrs=None, recursive=True, string=None, kwargs)

  • tag:标签名,字符串类型。
  • attrs:属性字典,用于进一步筛选标签。
  • recursive:是否递归查找子标签,默认为True。
  • string:字符串或正则表达式,用于查找包含特定文本的标签。

soup.find_all(tag, attrs=None, recursive=True, string=None, limit=None, kwargs)

        多了一个limit参数,可以限制查找的数量。

soup.select()则是用css选择器来选择元素,参数是个字符串,内写css选择器

示例:

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>  <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>  <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>  <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>  
</body>  
</html>"""  
soup = BeautifulSoup(html_doc, 'html.parser')  # 获取标题  
title = soup.title.text  
print(title)  # 获取第一个链接的href属性  
first_link = soup.find('a', class_='sister')  
print(first_link.get('href'))  # 获取所有链接的href属性  
all_links = soup.find_all('a', class_='sister')  
for link in all_links:  print(link.get('href'))soup.select('body>p')
soup.select('a[href*="example.com"]')# 查找href属性中包含"example.com"的a标签

获取节点属性

        每个通过Beautiful Soup解析得到的标签都是一个Tag对象,它拥有一些属性和方法,可以用来获取标签的详细信息或进行进一步的操作。

  • .name:获取标签的名称。
  • .attrs:获取标签的所有属性,以字典形式返回。
  • .string ,.text 或 .get_text():获取标签内的文本内容。
  • .parent:获取当前标签的父标签。
  • .next_sibling 和 .previous_sibling:获取当前标签的下一个和上一个兄弟标签。

较为常用的是.text和.attrs,示例:

print(soup.p.text)
print(soup.p.attrs) # class的value是列表,name的value是字符串 对应属性的性质,一个标签可以有多个类而不能有多个name
print(soup.p.attrs.get("class"))    #字典有两种取值方式 这种方式不会报错,下一行方式若没有对应的属性名会报错
print(soup.p.attrs["class"])

温馨提示

        request库中的reponse对象的text属性就是一个字符串

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot集成阿里easyexcel(一)基础导入导出
  • 2025考研倒计时 考研时间公布了 你准备好复习冲刺了吗?
  • 直播平台美颜功能开发方案:基于视频美颜SDK的集成详解
  • Java接口和抽象类的区别
  • 计算机组成原理(笔记5原码和补码的乘法以及直接补码阵列乘法器 )
  • 【Kubernetes】常见面试题汇总(二十八)
  • 【每日一题】LeetCode 2306.公司命名(位运算、数组、哈希表、字符串、枚举)
  • 技能深化与软实力双提升
  • Claude 的上下文检索功能提升了 RAG 准确率,这会是人工智能革命?
  • 某建筑市场爬虫数据采集逆向分析
  • pgvector docker版安装;稀疏向量使用;psycopg2 python连接使用
  • C语言究竟是一门怎样的语言?
  • Go语言中的并发编程
  • 24暑假实习信息、25秋招提前批信息,地信、测绘、遥感、地质相关岗位招聘汇总
  • C++标准库双向链表 list 中的insert函数实现。
  • [Vue CLI 3] 配置解析之 css.extract
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Bootstrap JS插件Alert源码分析
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • JAVA多线程机制解析-volatilesynchronized
  • Java基本数据类型之Number
  • MySQL-事务管理(基础)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • React-redux的原理以及使用
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • SQLServer之创建数据库快照
  • Vue.js 移动端适配之 vw 解决方案
  • 反思总结然后整装待发
  • 跨域
  • 说说动画卡顿的解决方案
  • 我从编程教室毕业
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 转载:[译] 内容加速黑科技趣谈
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # Java NIO(一)FileChannel
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (ibm)Java 语言的 XPath API
  • (LeetCode 49)Anagrams
  • (纯JS)图片裁剪
  • (多级缓存)缓存同步
  • (二)原生js案例之数码时钟计时
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • .net快速开发框架源码分享
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [ACP云计算]易混淆知识点(考题总结)
  • [BROADCASTING]tensor的扩散机制
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用