使用BeatifulSoup模块提取信息

简介: 使用BeatifulSoup模块提取信息

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

前提准备

需要安装beautifulsoup4和lxml:

pip install beautifulsoup4

pip install lxml

创建BeautifulSoup对象

导入beautifuosoup

from bs4 import BeautifulSoup

格式化html文本 ( 当然也可以用本地html文件 ) 为BeautifulSoup对象

import urllib.request
from bs4 import BeautifulSoup
response = urllib.request.urlopen("http://www.baidu.com")
html = BeautifulSoup(response.read().decode(), "lxml")
print(type(html)) # <class 'bs4.BeautifulSoup'>

对象的种类

  • Tag
    tag的意思就是标签,html文本就是有一个个标签组成的。如:
<html>
    <head>
        <title>Python</title>
        <meta chaset="utf-8"/>
    </head>
    <body>
        <p>Python真好!</p>
    </body>
</html>

这里尖括号括起来的就是一个个标签,有的是双标签,有的是单标签。

我们获取BeatifulSoup对象的某个标签时,就可以使用**.tagname**l来取得(只能获得第一个)

print(html.title) # <title>百度一下,你就知道</title>
print(html.a)     # <a class="toindex" href="/">百度首页</a>
print(type(html.a)) # <class 'bs4.element.Tag'>

NavigableString

得到了具体的标签我们就可以使用 .string来去的标签内部的信息

print(html.title.string) # 百度一下,你就知道
print(html.a.string) # 百度首页
print(type(html.a.string)) # <class 'bs4.element.NavigableString'>

遍历文档树

  • 直接子节点
    tag 的 .content 属性可以将tag的子节点以列表的方式输出:
print(html.head.contents)

.children,返回的是一个生成器对象

Iter = html.head.children
print(type(Iter)) # <class 'list_iterator'>
print(next(Iter)) # <meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>
print(next(Iter)) # <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
  • .contents 和 .children 属性仅包含tag的直接子节点,.descendants 属性可以对所有tag的子孙节点进行递归循环,和 children类似,返回的也是一个生成器对象
  • 节点内容
  • .string
    如果标签里还有唯一标签,会返回最深层数据,如果不唯一,则不会返回数据,返回None
  • .strings
    获取多个内容,但需要遍历
  • 父节点,.parent

兄弟节点,.next_sibling,.prev_sibling


全部兄弟节点,.next_siblings,.previous_siblings


搜索文档树

*find_all( name , attrs , recursive , text , *kwargs )

  • name参数—标签名
    A. 传tagname,表示查找所有的name的标签
    B. 传正则表达式,表示查找符合正则表达的标签
    C. 传列表,表示查找列表里所有的标签
  • keyword参数—属性
html.find_all(id="news_hot_data") # 查找id为“news_hot_data”的标签
html.find_all("img", class_="index-logo-src") # 查找所有class为“index-logo-src”的img标签
html.find_all(class_="index-logo-src",id="news_hot_data") # 查看class为“index-logo-src”且id为“news_hot_data”的标签

有一些特殊属性不能这样使用,但可以使用attrs参数

html.find_all(data-foo="value") # 不得行哦
html.find_all(attr={"data-foo": "value"}) # √


text参数

通过 text 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True:

html.find_all(text="31省区市新增确诊52例 本土36例")
  • limit参数
    限制返回的结果数量
  • recursive参数
    默认是True,表示会检测子孙节点,如果只想检测子节点,应设为False
  • find( name , attrs , recursive , text , **kwargs ),用法跟find_all一样,不同的是find只会寻找第一个
  • 其他(重点)
print('a标签类型是:', type(soup.a))   # 查看a标签的类型
print('第一个a标签的属性是:', soup.a.attrs)  # 获取a标签的所有属性(注意到格式是字典)
print('a标签属性的类型是:', type(soup.a.attrs))  # 查看a标签属性的类型
print('a标签的class属性是:', soup.a.attrs['class'])   # 因为是字典,通过字典的方式获取a标签的class属性
print('a标签的href属性是:', soup.a.attrs['href'])   # 同样,通过字典的方式获取a标签的href属性
print('a标签的href属性是:', soup.a['href']) # 效果一样

Css选择器

顾名思义我们需要用到Css的知识,基础的有:

  • 标签不需要任何修饰
  • class 前加点 .
  • id 前加井号 #
  • p:not(.haha),选择class不是haha的p标签
  • 选择器1选择器2选择器3 ,选择三者同时满足的标签
  • 父节点 > 子节点,如:p > a 表示选择p标签下的为直接节点的a标签

  • 祖先节点 子节点,如 p a 表示选择p标签下的所有a标签

我们需要使用select()函数,参数就是选择器。使用**.get_text()**来来获取选中标签的内容

html.select("title")  # 通过标签查找
html.select(".haha") # 通过类名为haha查找
html.select("#box1") # 通过id为box1来查找
html.select("p #box2") # 查找p标签下id为box2的内容
html.select('a[class="box"][id="p1"]') # 添加一些属性限制来查找.表示查找三个条件(a, class="box", id="p1")同事满足的标签

参考来源:

https://blog.csdn.net/qq_21933615/article/details/81171951

https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#find-all-next-find-next


目录
相关文章
|
传感器 机器学习/深度学习 Ubuntu
【ur3机械臂配置夹爪Robotiq2F-85】
【ur3机械臂配置夹爪Robotiq2F-85】
400 0
|
关系型数据库 MySQL
maxwell监听MySQL的Binlog
maxwell监听MySQL的Binlog
71 0
|
JavaScript
一个简单的js队列,逻辑很清晰
function Queue(type) { //type 是否是一个接着一个执行 function QueueConst() {} QueueConst.execute_ing=[], QueueConst.
623 0
|
C语言 iOS开发 C++
iOS - OC 面向对象语法
1、类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类。 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类。 2)分类/类别(category):允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量)。
1222 0
|
安全 关系型数据库 MySQL
如何打开MySQL中root账户的远程登录
基于安全考虑root账户一般只能本地访问,但是在开发过程中可能需要打开root的远程访问权限。下面是基本的步骤: 1、登录到mysql中,为root进行远程访问的授权,执行下面的命令:   mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; mysql> flush privileges;   第一句中"%"表示任何主机都可以远程登录到该服务器上访问。
891 0
|
20天前
|
存储 人工智能 测试技术
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
141061 20
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
|
19天前
|
人工智能 运维 前端开发
基于阿里百炼的DeepSeek-R1满血版模型调用【零门槛保姆级2084小游戏开发实战】
本文介绍基于阿里百炼的DeepSeek-R1满血版模型调用,提供零门槛保姆级2048小游戏开发实战。文章分为三部分:定位与核心优势、实战部署操作指南、辅助实战开发。通过详细步骤和案例展示,帮助开发者高效利用DeepSeek-R1的强大推理能力,优化游戏逻辑与视觉效果,解决官网响应延迟问题,提升开发效率和用户体验。适合企业开发者、教育行业及多模态探索者使用。
70896 17
基于阿里百炼的DeepSeek-R1满血版模型调用【零门槛保姆级2084小游戏开发实战】
|
27天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
358010 62
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
|
23天前
|
人工智能 自然语言处理 API
快速使用 DeepSeek-R1 满血版
DeepSeek是一款基于Transformer架构的先进大语言模型,以其强大的自然语言处理能力和高效的推理速度著称。近年来,DeepSeek不断迭代,从DeepSeek-V2到参数达6710亿的DeepSeek-V3,再到性能比肩GPT-4的DeepSeek-R1,每次都带来重大技术突破。其开源策略降低了AI应用门槛,推动了AI普惠化。通过阿里云百炼调用满血版API,用户可以快速部署DeepSeek,享受高效、低成本的云端服务,最快10分钟完成部署,且提供免费token,极大简化了开发流程。
191013 23
快速使用 DeepSeek-R1 满血版