python爬虫之BeautifulSoup

七、输出格式化

八、其他特性


BeautifulSoup 是一个用于从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器(例如lxml,html5lib)来解析这些文件。下面是一个基本的使用指南。

一、安装

首先,你需要安装 beautifulsoup4 包,这通常可以通过pip完成:

pip install beautifulsoup4

如果你想使用 lxml 的解析器(速度快,效率高),你还需要安装 lxml

pip install lxml

二、基本使用

导入BeautifulSoup类,并加载一个文档。

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>

<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/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

soup = BeautifulSoup(html_doc, 'html.parser')  # 或者 'lxml' 来使用lxml解析器

三、导航树结构
# 访问标签内容
soup.title
# <title>The Dormouse's story</title>

soup.title.name
# 'title'

soup.title.string
# 'The Dormouse's story'

soup.title.parent.name
# 'head'

soup.p
# <p class="title"><b>The Dormouse's story</b></p>

soup.p['class']
# ['title']

soup.a
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

soup.find_all('a')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, ...]

soup.find(id="link3")
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

四、搜索文档树

find_all()find() 是BeautifulSoup中的两个常用方法,它们用于搜索文档树并提取信息。

基本调用格式如下:

find(name, attrs, recursive, string, **kwargs)

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

参数说明:

  • name:要查找的标签的名称或者匹配名称的任何对象。
  • attrs:一个 Python 字典,包含标签的属性。你可以添加一个或多个属性来精确匹配。
  • recursive:如果为 True(默认值),find() 方法会检查当前标签的所有子孙节点。如果为 False,则只检查当前标签的直接子节点。
  • string:用于查找标签的文本内容。你可以使用字符串、正则表达式、列表或者 True。
  • **kwargs:特定属性过滤器,例如 idclass_ 等。
4.1 find_all()

find_all() 方法搜索当前标签的所有子孙节点,并返回所有符合条件的标签内容。这是一个非常灵活的方法,因为它允许你指定你想要检索的标签的名称、属性、内容,甚至是使用函数来进行复杂的匹配。

这是find_all()的一些基本用法:

soup.find_all('tag_name') # 返回包含所有<tag_name>标签的列表
soup.find_all(['tag1', 'tag2']) # 返回包含所有<tag1>和<tag2>标签的列表
soup.find_all(id='tag_id') # 返回包含所有id属性为'tag_id'的标签的列表
soup.find_all(class_='class_name') # 返回包含所有class属性为'class_name'的标签的列表
soup.find_all(attrs={'attribute_name': 'value'}) # 返回包含所有具有指定属性的标签的列表
soup.find_all(text='text') # 返回包含文本内容为'text'的标签的列表
soup.find_all(limit=2) # 返回最多2个符合条件的标签

4.2 find()

find() 方法与 find_all() 类似,但它只返回找到的第一个符合条件的标签。如果文档中存在多个匹配项,find() 将只返回第一个匹配项。这对于只需要一个元素,或者确定只有一个元素存在时特别有用。

以下是find()的一些基本用法:

soup.find('tag_name') # 返回第一个<tag_name>标签
soup.find(id='tag_id') # 返回第一个id属性为'tag_id'的标签
soup.find(class_='class_name') # 返回第一个class属性为'class_name'的标签
soup.find(attrs={'attribute_name': 'value'}) # 返回第一个具有指定属性的标签
soup.find(text='text') # 返回第一个文本内容为'text'的标签

4.3 使用场景

通常来说,如果你只需要找到一个特定的元素,比如一个具有特定 ID 的元素,你会使用 find()。如果你需要获取多个元素,比如文档中所有的链接,你会使用 find_all()

4.4 举例说明

HTML 文档:

<html>
 <body>
  <h1>Header 1</h1>
  <h2>Header 2</h2>
  <p>First Paragraph.</p>
  <p>Second Paragraph.</p>
 </body>
</html>

如果你使用 find_all()

paragraphs = soup.find_all('p')
# 返回的是包含所有 <p> 标签的列表

如果你使用 find()

first_paragraph = soup.find('p')
# 返回的是第一个 <p> 标签

五、标签Tag对象操作
5.1 获取和设置属性
  • tag['attr']: 获取标签的某个属性值,比如tag['href']获取<a>标签的链接地址。
  • tag.attrs: 获取一个字典,包含了标签的所有属性。
  • tag['attr'] = 'new value': 设置或修改标签的属性值。
5.2 访问标签的内容
  • tag.string: 如果标签只有一个子节点,并且这个子节点是字符串类型,tag.string返回子字符串。如果标签包含多个子节点,tag.string将返回None
  • tag.get_text(): 提取标签内的所有文本内容,包括子标签内的文本。
  • tag.text: 类似tag.get_text(),提取标签内的所有文本内容。
5.3 寻找标签
  • tag.find(name, attrs, recursive, string, **kwargs): 返回匹配查询的第一个标签。
  • tag.find_all(name, attrs, recursive, string, limit, **kwargs): 返回一个包含所有匹配查询的标签的列表。
  • tag.find_parent(name, attrs, string, **kwargs): 查找当前标签的父标签。
  • tag.find_parents(name, attrs, string, limit, **kwargs): 递归查找当前标签的所有父标签。
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

862fe4e9.png)

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

img
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值