【Python beautiful soup】如何用beautiful soup 解析HTML内容

news2024/11/25 6:49:30

在这里插入图片描述

美丽汤(Beautiful Soup)是一个流行的Python库,用于从HTML或XML文件中提取数据。它将复杂的HTML文件转化为一个Python对象,使得用户可以更方便地解析、搜索和修改HTML内容。本文将介绍如何使用Beautiful Soup解析HTML内容,并给出参考资料和优秀实践。

一、Beautiful Soup的基本使用

1.安装

要使用BeautifulSoup,首先需要安装它。可以使用pip安装:

pip install beautifulsoup4

2.导入

安装完成后就可以导入BeautifulSoup了:

from bs4 import BeautifulSoup

3.获取HTML

要在BeautifulSoup中解析HTML,需要先将HTML文件读取为字符串。可以使用Python的标准库处理文件IO来读取文件:

with open("index.html", "r", encoding='utf-8') as f:
    html = f.read()

如果要从URL中获取HTML,则可以使用Python的requests库:

import requests

url = "https://www.example.com"
response = requests.get(url)
html = response.content

4.解析HTML

现在有了HTML字符串,就可以使用BeautifulSoup来解析HTML了。首先需要创建一个BeautifulSoup对象:

soup = BeautifulSoup(html, 'html.parser')

这里的第二个参数告诉BeautifulSoup使用哪种解析器(例如,‘html.parser’ 使用Python标准库中的解析器来解析HTML)。在创建BeautifulSoup对象后,就可以使用它的方法和属性来访问HTML内容了。

5.搜索标签

解析HTML后,可以使用BeautifulSoup的方法来搜索标签。例如,要搜索所有的

标签,可以使用soup.find_all(‘p’)方法:

p_tags = soup.find_all('p')

这将返回一个包含

标签的BeautifulSoup对象列表。如果只需要第一个

标签,可以使用soup.find(‘p’)方法。

6.获取标签内容

要获取标签的内容,在BeautifulSoup对象上调用标签的.text属性即可。例如,获取第一个

标签的文本内容:

first_p_text = soup.find('p').text

第一个

标签的完整标签和其文本内容:

first_p = soup.find('p')
first_p_tag = str(first_p)
first_p_text = first_p.text

7.获取标签属性

要获取标签的属性,可以在标签上调用相应的属性名。例如,获取第一个标签的href属性:

first_a_href = soup.find('a')['href']

二、Beautiful Soup实践

1.搜索标签

BeautifulSoup提供了各种方法来搜索标签,如上文所述。下面我们将进行更详细的介绍。

find_all()方法

find_all()方法返回BeautifulSoup对象列表,其中包含符合指定参数的所有标签。它的基本用法是:

soup.find_all('tag', attributes)

其中tag是要搜索的标签名,attributes是一个字典,包含标签的属性和属性值。

例如,要搜索文档中所有的

标签,可以使用:

soup.find_all('div')

如果要搜索标签的属性,则可以使用以下代码:

soup.find_all('div', class_='my_class')

其中class_是标签的class属性,因为在Python中class是一个保留字,所以需要在后面加上下划线。

如果要搜索多个标签,则可以将所有的标签名放在一个列表中:

soup.find_all(['div', 'p'])

如果要搜索所有的标签,则可以调用soup.find_all(True)。

此外,find_all()方法还可以接受一些额外的参数,如string参数,用于搜索具有特定字符串的标签:

soup.find_all(string='example')

或使用正则表达式搜索:

import re
soup.find_all(string=re.compile('^example'))

find()方法

find()方法与find_all()方法类似,但它只返回第一个匹配项。例如,要查找第一个

标签:

soup.find('p')

如果要在一个标签的子标签中查找,则可以使用该标签的方法:

div = soup.find('div')
p = div.find('p')

其他方法

BeautifulSoup还提供了一些其它的方法,如select()方法。该方法基于CSS选择器选择标签:

soup.select('div p')
```python
此外,还有find_parents(),find_next_siblings()等方法,用于搜索标签的上下文和兄弟关系。

2.修改HTML内容

BeautifulSoup不仅可以用于解析HTML,还可以用于修改其内容。下面将介绍一些常用的方法。

修改标签的属性

如果要修改标签的属性,可以在标签上调用相应的属性名。例如,将第一个<a>标签的href属性修改为new_href:
```python
soup.find('a')['href'] = 'new_href'

如果要添加一个新的属性,可以使用相同的语法:

soup.find('a')['new_attr'] = 'new_value'

修改标签的文本内容

如果要修改标签的文本内容,可以在标签上调用.text属性。例如,将第一个

标签的文本内容修改为new_text:

soup.find('p').text = 'new_text'

修改标签的名称

如果要修改标签的名称,可以在标签上调用.name属性。例如,将第一个

标签的名称修改为new_tag:

soup.find('div').name = 'new_tag'

删除标签

如果要删除一个标签,可以使用.decompose()方法。例如,将第一个

标签删除:

soup.find('p').decompose()

插入标签

如果要在HTML中插入一个新的标签,可以使用soup.new_tag()方法创建一个新标签,然后将其插入到DOM中。例如,将一个新的

标签插入到HTML的开头:

new_p = soup.new_tag('p', attrs={'class': 'new_class'})
new_p.string = 'new_paragraph'
soup.insert(0, new_p)

此外,insert_after()和insert_before()方法也可以用于在DOM中插入标签。

3.将HTML转换为字符串

要将解析后的HTML转换为字符串,可以在BeautifulSoup对象上调用.prettify()方法。例如:

print(soup.prettify())

这将返回一个格式化和缩进后的HTML字符串,可以用于保存或打印解析后的HTML。

三、参考资料

下面列出了一些关于BeautifulSoup的参考资料。

1.Documentation:

BeautifulSoup的官方文档是学习BeautifulSoup库的最佳资料。它详细介绍了BeautifulSoup的API和使用方法。

https://www.crummy.com/software/BeautifulSoup/bs4/doc/

2.Tutorial:

BeautifulSoup的官方教程是一份简单而明了的指南,适合初学者。

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#tag

3.Stack Overflow:

Stack Overflow是一个程序员问答网站,可以在这里搜索有关BeautifulSoup的问题和答案。

https://stackoverflow.com/questions/tagged/beautifulsoup

四、优秀实践

下面列出了一些优秀实践,可作为使用BeautifulSoup的模板。

1.爬取X度搜索结果

以下代码使用BeautifulSoup爬取X度搜索结果的

和标签:

import requests
from bs4 import BeautifulSoup

def get_baidu_results(query):
    url = f"https://www.xxx.com/s?wd={query}"
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    results = []
    for item in soup.find_all('div', {'class': 'c-container'}):
        heading = item.find('h3', {'class': 't'})
        if heading:
            link = heading.find('a')
            url = link.get('href')
            text = link.text.strip()
            result = {'url': url, 'text': text}
            desc = item.find('div', {'class': 'c-abstract'})
            if desc:
                desc = desc.text.strip()
                result['description'] = desc
            results.append(result)
    return results

query = 'python'
results = get_baidu_results(query)
for result in results:
    print(result['text'])
    print(result['url'])
    print(result['description'])
    print()

2.爬取Douban电影Top250

以下代码使用BeautifulSoup爬取电影Top250的电影名、导演、演员、评分和简介:

import requests
from bs4 import BeautifulSoup

def get_douban_top250():
    url = "https://movie.xxx.com/top250"
    headers = {'User-Agent': 'Mozilla/5.0'}
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.content, 'html.parser')
    results = []
    for item in soup.find_all('div', {'class': 'item'}):
        info = item.find('div', {'class': 'info'})
        title = info.find('span', {'class': 'title'}).text
        directors = info.find('div', {'class': 'bd'}).find_all('span')[1].text.strip().split('\xa0')
        actors = info.find('div', {'class': 'bd'}).find_all('span')[3].text.strip().split('\xa0')
        rating = info.find('span', {'class': 'rating_num'}).text
        summary = info.find('span', {'class': 'inq'}).text if info.find('span', {'class': 'inq'}) else ''
        result = {'title': title, 'directors': directors, 'actors': actors, 'rating': rating, 'summary': summary}
        results.append(result)
    return results

results = get_douban_top250()
for result in results:
    print(result['title'])
    print('导演:', result['directors'])
    print('演员:', result['actors'])
    print('评分:', result['rating'])
    print('简介:', result['summary'])
    print()

五、总结

BeautifulSoup是一个功能强大的Python库,可以用于解析、搜索和修改HTML和XML文件。本文介绍了BeautifulSoup的基本使用、实践和参考资料。使用BeautifulSoup可以轻松地处理网页数据,具有广泛的应用场景,如爬虫、数据挖掘和数据分析等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据的家——MySQL的数据目录

之前学过了行格式&#xff0c;在往上面是页&#xff0c;最上层的也就学到了页。 现在的数据目录是什么&#xff1f;这之间有什么关系呢&#xff1f;带着这个问题&#xff0c;来继续学习。 数据库和文件系统的关系是什么&#xff1f; InnoDB和MyISAMy 是把表存储在磁盘上面的…

【计算机网络之HTTP篇】HTTPS与HTTP的区别

目录 HTTPS产生的原因 HTTPS工作原理 对称加密 非对称加密 引入数字证书 HTTPS完整工作流程 高频面试题&#xff1a;HTTPS与HTTP的区别 HTTPS产生的原因 HTTP协议是按照文本的形式来明文传递数据的&#xff0c;因此数据很容易被黑客劫持&#xff0c;发生泄密可能。 HTTP…

AlmaLinux 8.8 发布 - RHEL 下游免费发行版(CentOS 稳定版的替代品)

AlmaLinux 8.8 发布 - RHEL 下游免费发行版&#xff08;CentOS 稳定版的替代品&#xff09; AlmaLinux OS 是一个开源、社区驱动的项目&#xff0c;旨在提供 CentOS 稳定版的替代品。 请访问原文链接&#xff1a;https://sysin.org/blog/almalinux-8/&#xff0c;查看最新版。…

Linux系统编程——多线程[补充]:懒汉模式自旋锁读者写者问题

0.关注博主有更多知识 操作系统入门知识合集 目录 1.单例设计模式 1.1将线程池设计为懒汉方式实现的单例模式 1.2线程安全版本的懒汉方式 2.STL、智能指针与线程安全 3.自旋锁 4.读者写者问题 1.单例设计模式 在一些软件设计场景当中&#xff0c;要求某些类只能具有一…

五一后“实在高校行”紧锣密鼓走进四所高校,校企合作硕果累累!

近年来&#xff0c;随着人工智能科技的快速发展&#xff0c;越来越多高校加快了与先进企业在培养优秀人才的合作步伐。实在智能一直注重校园生态发展及在人才培养&#xff0c;不断引进数字化人才&#xff0c;做强培训师资&#xff1b;同时积极走出去&#xff0c;在全社会范围内…

2023-05-20:go语言的slice和rust语言的Vec的扩容流程是什么?

2023-05-20&#xff1a;go语言的slice和rust语言的Vec的扩容流程是什么&#xff1f; 答案2023-05-20&#xff1a; go语言的slice扩容流程 go版本是1.20.4。 扩容流程见源码见runtime/slice.go文件中的growslice 函数。 growslice 函数的大致过程如下&#xff1a; 1.如果元…

Mybatis Plus之DQL(条件查询方式、查询投影、查询条件设定、字段映射与表名映射)

文章目录 1 条件查询1.1 条件查询的类1.2 环境构建1.3 构建条件查询1.4 多条件构建1.5 null判定 2 查询投影2.1 查询指定字段2.2 聚合查询2.3 分组查询 3 查询条件3.1 等值查询3.2 范围查询3.3 模糊查询3.4 排序查询 4 映射匹配兼容性问题1:表字段与编码属性设计不同步问题2:编…

你真的知道怎么使用vs吗?把把手教你实用调试小技巧

实用调试小技巧 1.什么是bug&#xff1f;2.调试是什么&#xff1f;有多重要&#xff1f;3.debug和release的介绍。4.windows环境调试介绍。4.1常见调试快捷键4.2 调试的时候查看程序当前信息4.2.1监视&#xff1a;4.2.2内存4.2.3调用堆栈4.2.4反汇编4.2.5寄存器 5.一些调试的实…

HNU-计算机系统-实验4-ShellLab

ShellLab 计科2102 梅炳寅 202108010206 写在前面 作为一份实验报告,我希望阅读者能够比较好地看到这份报告有价值的部分。私以为更为有价值的部分体现在: 报告中打★的部分,最后的代码中,我在代码中加入了大量的中文注释、函数原型、参数解读、以及个人对代码的推断与理…

网易云音乐开发--音乐播放暂停切换上下首功能实现

音乐播放暂停功能实现 封装一个控制音乐播放/暂停的功能函数 看一下文档&#xff0c;我需要用的api 这个接口好像没有音频的url&#xff0c;查看一下&#xff0c;换个api 这样就能拿到id&#xff0c;并可以播放了 但是音乐并没有播放 我们少了这个 现在可以播放了&#xff…

[CTF/网络安全] 攻防世界 view_source 解题详析

[CTF/网络安全] 攻防世界 view_source 解题详析 查看页面源代码方式归类总结 题目描述&#xff1a;X老师让小宁同学查看一个网页的源代码&#xff0c;但小宁同学发现鼠标右键好像不管用了。 查看页面源代码方式归类 单击鼠标右键&#xff0c;点击查看页面源代码&#xff1a; …

Linux 指令(三)+完整思维导图+实图例子+深入细节+通俗易懂建议收藏

绪论 涓滴之水终可磨损大石&#xff0c;不是由于它的力量强大&#xff0c;而是由于昼夜不舍的滴坠。今天我们继续学习Linux指令。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 附&#xff1a;红色&#xff0c;部分为重点部分&#xff1b;蓝颜…

由斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名

由 Stanford Blockchain Accelerator、Zebec Protocol、 Nautilus Chain、Rootz Lab 共同主办的黑客松活动&#xff0c;现已接受优秀项目提交参赛申请。 在加密行业发展早期&#xff0c;密码极客们就始终在对区块链世界基础设施&#xff0c;在发展方向的无限可能性进行探索。而…

四、easyUI中的tabs(选项卡)组件

1.tabs&#xff08;选项卡&#xff09;组件的概述 选项卡会显示一批面板&#xff0c;但在同一个时间只会显示一个面板。每个选项卡面板都有头标题和一些小的按钮工具菜单&#xff0c;包括关闭按钮和其他自定义按钮。 2.tabs&#xff08;选项卡&#xff09;组件的使用 在项目新…

【C++】——内存管理(new和delete)

文章目录 1. 前言2. C/C内存分布3. C语言动态内存管理方式4. C内存管理方式4.1 内置类型4.2 自定义类型 5. operator new与operator delete函数6. new和delete的实现原理7. 定位new表达式(placement-new)8. 结尾 1. 前言 在学习C语言的时候&#xff0c;我们学习了动态内存管理…

物联网协议之MQTT

MQTT 简介 MQTT 可以简单看做一个网络协议&#xff0c;用于机器对机器的通信&#xff08;与客户端到服务器的传输有点区别&#xff09;。智能传感器、可穿戴设备和其他物联网&#xff08;IoT&#xff09;设备通常必须通过带宽有限的资源受限网络传输和接收数据。这些物联网设…

更新cuda和 pytorch==1.12.1版本,更新到cuda11.3.1

nvidia-smi 查看gpu支持的最高cuda版本 nvcc -V 查看当前cuda版本 卸载旧版本cuda 除了NVIDIA Geforce、NVIDIA PhysX、NVIDIA图形驱动程序&#xff0c;将电脑中其他NVIDIA开头的全部卸载 安装cuda 下载适合的cuda版本 https://developer.nvidia.com/cuda-toolkit-ar…

基于QT开发的使用OPC_UA与西门子1200,1500系列PLC通信的工业监控Demo

目录 一&#xff0c;总体介绍 二&#xff0c;需要的软件 三&#xff0c;需要的硬件 四&#xff0c;QT程序代码 五&#xff0c;西门子PLC代码 一&#xff0c;总体介绍 先看一下图1-1的QT运行界面图&#xff0c;界面中服务器地址就是OPC_UA服务器地址&#xff0c;整个项目作…

图解LeetCode——19. 删除链表的倒数第 N 个结点

一、题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 二、示例 2.1> 示例 1&#xff1a; 【输入】head [1,2,3,4,5], n 2 【输出】[1,2,3,5] 2.2> 示例 2&#xff1a; 【输入】head [1], n 1 【输出】[] 2.3> 示例…

数值计算 - 误差的来源

误差的来源是多方面的&#xff0c;但主要来源为&#xff1a;过失误差&#xff0c;描述误差&#xff0c;观测误差&#xff0c;截断误差和舍入误差。 过失误差 过失误差是由设备故障和人为的错误所产生的误差&#xff0c;在由于每个人都有“权利”利用机器进行数值计算,所以在计算…