返回顶部
首页 > 资讯 > 后端开发 > Python >Python中BeautifulSoup模块详解
  • 431
分享到

Python中BeautifulSoup模块详解

2024-04-02 19:04:59 431人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言安装库导入库解析文档示例提取数据示例CSS选择器实例小项目总结前言     BeautifulSoup是主要以解析WEB网页的python模块,

前言

    BeautifulSoup是主要以解析WEB网页的python模块,它会提供一些强大的解释器,以解析网页,然后提供一些函数,从页面中提取所需要的数据,目前是python爬虫中最常用的模块之一。

安装库

       在使用前需要安装库,这里建议安装bs4,也就是第四版本,因为根据官方文档第三版的已经停止更新。同时安装lxml解释器

pip3 install bs4

pip3 install lxml

导入库

from bs4 import BeautifulSoup

解析文档示例

        这里以官方文档进行举例,我把常用的函数都举出来,实际开发过程中用到的不多,了解就可以。

# 取自《爱丽丝梦游仙境》的一段
html = """
    <html><head><title>The DORMouse's story</title></head>
    <body>
    <p class="title" name="dromouse"><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/lacsie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/title" class="sister" id="link3">Tillite</a>;
    and they lived at the bottom of a well.</p>
    <p class="story">...</p>
"""
 
# 解析文档,建立一个BeautifulSoup对象,各种函数都是针对此对象展开,此函数会自动编码为Unicode
 
soup = BeautifulSoup(html,'lxml')

此函数有两个参数:

1、需要解析的文本,可以使字符串,可以使本地文件

2、解释器,这里有"lxml", "lxml-xml", "html.parser", or "HTML5lib",4种,可以解析绝大多数网页,常用lxml解析    这里有一个坑,如果网页中没有规定编码格式,解释器就不能编码为Unicode,必须先声明一下编码格式,只需要到网页源码中查找编码格式然后做个声明就可以。一般在网页中查找charset关键字。

# 美化文档,有些网页书写不规范,这个函数会补全标签,使其看起来更规范
print(soup.prettify())

提取数据示例

        获取到文本后,接下来需要提取我们所需的数据,这里用到选择器 有三种选择器        

标签选择器(tag选择器)

标准选择器

CSS选择器

1、标签选择器(tag选择器)

# 直接用标签获取标题
print("title: ", soup.title)
# 获取标题文本
print(soup.title.text)
# 获取p标签
print(soup.p)
# 获取head标签
print(soup.head)
# 获取a标签
print(soup.a)

输出: 

标签中最重要的俩个属性:name、attributes

# 使用.name函数获取标签名
print('标题标签的名字: ', soup.title.name)
# tag的属性用法和字典基本一样,可以用属性名取属性,类似字典的键值对,也可以用.attrs取属性:
print('a标签中属性为"href"的值: ', soup.a["href"])
# 会返回一个字典,需要何种属性可自行提取
print('a标签的所有属性: ',soup.a.attrs)
dict1 = soup.a.attrs
# 属性为class的值
print('属性为class的值: ', dict1['class'])

输出:

这里的子孙父兄节点,我感觉用起来忒不顺手,可能是我学的不太彻底?,我在这里列出来,大家看看。

# 返回子节点的列表
print("p的子节点: ", soup.p.contents)
# 返回子节点的生成器
print('a的子节点: ', soup.a.children)
# 返回子孙结点的生成器
print("a的子孙结点: ", soup.a.descendants)
# 返回父节点
print("a的父节点: ", soup.a.parent)
# 递归父节点
print("a的递归父节点: ",soup.a.parents)

输出: 

         上述的标签选择器如果遇到相同的标签名,比如说上述的文档中就有多个a标签,这时就没法选择相同标签的第二个标签,也可能是我没会操作,如果有发现的欢迎评论。

        所以需要一个遍历全文的选择器来提取数据: find_all( name , attrs , recursive , text , **kwargs ) # 可根据标签名、属性、内容查找文档,此函数配合正则表达式可匹配出各种特定的数据。。。

# 遍历文档中所有a标签
print("文档中所有a标签: ", soup.find_all('a'))
a_list = soup.find_all('a')
for i, aList in enumerate(a_list):
    print(i, aList)

输出:可以提取到文本中所有a标签的内容,再通过遍历就可以得到每一个的内容

 根据属性、文本筛选

# 根据属性筛选
print(soup.find_all(attrs={'class': 'sister'}))
# 根据文本筛选
print(soup.find_all(text="The Dormouse's story"))

正则表达式筛选

#使用正则表达式找出文本中带有story字符串的内容
print(soup.find_all(text=re.compile('story')))

还有一个find()方法,用法和findall()类似,不同的是返回的只有一个值,而 findall()返回的是列表。

CSS选择器

        目前来说,CSS选择器是最常用的一种,通过标签及属性的层层嵌套可以实现各种特定内容的提取。

# 元素选择器:选择p标签
print('标签为p:', soup.select("p"))
# 类选择器:类前加'.'
print("文本中所有class类的标签: \n", soup.select('.sister'))
# id选择器:id前加'#'
print("id为link2的标签: \n", soup.select('#link2'))

输出: 

# 属性选择器:
print("属性为name的标签: \n", soup.select("p[name]"))
print("选择所有属性中有sister的标签: \n", soup.select("*[href]"))
print("选择p标签的后代第三个a标签 \n", soup.select("p>a")[2])
print("选择id=link1后的所有兄弟标签 \n", soup.select("#link1 ~ .sister"))
print('通过属性为 href="http://example.com/title进行查找" \n', soup.select('a[href="http://example.com/title"]'))
print("通过href属性中以http开头的所有标签的查找 \n", soup.select('a[href^="http"]'))
print("通过href属性中以elsie结尾的所有标签的查找 \n", soup.select('a[href$="elsie"]'))
print("通过href属性中包含.com的所有标签的查找 \n", soup.select("a[href*='.com']"))
# 通过标签层层查找,这里的:nth-child(2)代表第二个p标签,a#link2表示a标签的id为link2的标签
print("通过标签层层查找 \n", soup.select("body>p:nth-child(2)>a#link2"))

示例输出:大家可以自行试试 

 以上的CSS选择器的常用函数已经讲完,通过上面的示例基本上可以拿到web文本中绝大多数数据。下面通过一个小栗子试试水。

实例小项目

需求:爬取某代理网站的免费代理IP地址

第一步:请求数据,获取数据文本第二步:通过BeautifulSoup分析数据 提取数据第三步:保存数据到本地文本

url = "https://www.89ip.cn/"
header = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
                       "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"}
# 请求数据
response = requests.get(url, headers=header)
print(response.status_code)
# 判断是否请求成功
if response.status_code == 200:
    # 获取web信息的文本模式
    dataText = response.text
    # 使用lxml解析器解析文本
    soup = BeautifulSoup(dataText, 'lxml')
    # 观察网页源码,获取需求数据,这里使用CSS选择器层层嵌套获得最终的ip信息
    ipText = soup.select('body div>div>div>div>table>tbody>tr>td:nth-child(1)')
    # 遍历列表获取每一个ip地址
    for i in range(len(ipText)):
        # 获取ip的文本信息,get_text()是获取文本,strip()是去掉两边空格
        ip = ipText[i].get_text().strip()
        # 保存到本地
        file = open("ipText.txt", 'a+')
        file.write(ip+"\n")
    # 关闭文件
    file.close()

运行结果: 

总结

        BeautifulSoup模块主要作用是网页解析、提取数据,主要有三种提取数据的选择器,最常用的是CSS选择器,可以根据层层嵌套的方式获取所需信息。在这里需要一点HTML和CSS基本知识。

到此这篇关于Python中BeautifulSoup模块详解的文章就介绍到这了,更多相关Python BeautifulSoup模块内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python中BeautifulSoup模块详解

本文链接: https://lsjlt.com/news/138293.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python中BeautifulSoup模块详解
    目录前言安装库导入库解析文档示例提取数据示例CSS选择器实例小项目总结前言     BeautifulSoup是主要以解析web网页的Python模块,...
    99+
    2024-04-02
  • Python中模块string.py详解
    一、用法 字符串常量: import string print(string.ascii_lowercase) print(string.ascii_uppercase) print(string....
    99+
    2022-06-04
    详解 模块 Python
  • python中os模块详解
    os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作。比如说:绝对路径,父目录…… os.sep可以取代操作系统特定的路径分隔符。windows下为 “\”,Linux下...
    99+
    2022-06-04
    详解 模块 python
  • 详解python时间模块中的datetime模块
    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime。time模块我在之前的文章已经有所介绍,它提供的接口与C标准库time.h基本一致。相比于time模块,dat...
    99+
    2022-06-04
    模块 详解 时间
  • 详解Python中的PyInputPlus模块
    目录安装PyInputPlus关键字参数min、max、greaterThan和lessThan关键字参数blank关键字参数limit、timeout和default关键字参数al...
    99+
    2024-04-02
  • 详解Python中的Array模块
    Python中的array模块是一个预定义的数组,因此其在内存中占用的空间比标准列表小得多,同时也可以执行快速的元素级别操作,例如添加、删除、索引和切片等操作。此外,数组中的所有元素...
    99+
    2023-05-15
    Python Array模块 Python Array
  • python中模块导入模式详解
    目录模块导入1.1 import导入模块1.2 from 模块名 import 导入模板的方法1.3 as 关键字OS模块操作文件OS模块的作用模块的制作、发布、安装3.1 模块制作...
    99+
    2024-04-02
  • 详解Python requests模块
    前言 虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更简洁方便。...
    99+
    2022-06-02
    Python requests模块 Python模块
  • python datetime模块详解
    目录1. 获取当前时间2. 时间间隔 timedelta3. datetime 转 字符串 strftime()4. 字符串 转 datetime对象 datetime.strpti...
    99+
    2024-04-02
  • python—requests模块详解
    一、前言 1、requests简介 requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,它是python语言的第三方的库,专门用于发送HTTP请求,使用...
    99+
    2023-09-04
    python 开发语言 requests 网络爬虫
  • python—xlwt模块详解
    一、前言 xlwt模块是python中专门用于写入Excel的拓展模块,可以实现创建表单、写入指定单元格、指定单元格样式等人工实现的功能,一句话就是人使用excel实现的功能,这个扩展包都可以实现。 ...
    99+
    2023-09-04
    python excel 自动化办公 xlwt
  • Python re模块详解
    今天学习测试了一下Python中的正则表达式的模块用法。初学 Python ,对 Python 的文字处理能力有很深的印象,除了 str 对象自带的一些方法外,就是正则表达式这个强大的模块了。但是对于初学者来说,要用好这个功能还是有点难度,...
    99+
    2023-01-31
    详解 模块 Python
  • python requests模块详解
    requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: python的标准库urllib2提供了大部分需要的HTTP功能,但是A...
    99+
    2023-01-31
    详解 模块 python
  • python sys模块详解
      sys.argv           命令行参数List,第一个元素是程序本身路径 sys.modules.keys() 返回所有已经导入的模块列表 sys.exc_info()     获取当前正在处理的异...
    99+
    2023-01-31
    详解 模块 python
  • python中os模块和sys模块的使用详解
    目录一、os模块二、os模块中的os.walk()函数三、sys模块一、os模块 os.getcwd() 获取当前的工作目录 os.chdir(‘绝对路径/相对于当前工作...
    99+
    2023-03-21
    python os模块 python sys模块
  • Python中标准模块importlib详解
    1 模块简介 Python提供了importlib包作为标准库的一部分。目的就是提供Python中import语句的实现(以及__import__函数)。另外,importlib允许程序员创建他们自定义的对...
    99+
    2022-06-04
    详解 模块 标准
  • Python中Numpy模块使用详解
    目录NumPyndarray对象​ ​Numpy数据类型​​Numpy数组属性NumPy NumPy(Numerical Python) 是 Python 的一个扩展程序库...
    99+
    2024-04-02
  • Python中String模块示例详解
    目录Python中String模块详解一、 字符串常量二、 类1、 格式化1.1 介绍1.2 简单应用1.3 格式化输出2、 模板化三、 函数Python中String模块详解 一、...
    99+
    2022-12-24
    Python中String模块 Python String模块
  • Python中ConfigParser模块示例详解
    目录1. 简介2. ini配置文件格式3. 读取ini文件3.1 初始化对象并读取文件3.2 获取并打印所有节点名称3.3 获取指定节点的所有key3.4 获取指定节点的键值对3.5...
    99+
    2023-01-15
    Python中ConfigParser模块 Python中ConfigParser
  • Python之re模块详解
    目录Python——re模块 简介预定义字符特殊字符反斜杠问题匹配方法总结Python——re模块  简介 定义:re模块称为正则表达式; 作用:创建一个"规则表...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作