Python爬虫bs4基本使用

ops/2024/11/17 10:45:08/

一、bs4

1、bs4获得标记的子集或父集或兄弟节点

(1)子集:

通过contentschildren可以获得子集,前者获得的是字符串列表,后者获得的是一个列表迭代器对象,需要遍历获得内容

比如我们有以下代码和数据:

python">from bs4 import BeautifulSoup
html = """
<html><head><title>The Dormouse's story</title></head><body><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"><span>Elsie</span></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,'lxml')

对于上述代码说明请参考主页上一篇文章

案例:

我们要获得p标签的子集:

python">print(soup.p.contents)

输出:

python">['\n            Once upon a time there were three little sisters; and their names were\n            ', <a class="sister" href="http://example.com/elsie" id="link1">
<span>Elsie</span>
</a>, '\n', <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, ' \n            and\n    

 

 或:

python">soup.p.children

但是这种方法返回的是一个列表,我们需要对他进行迭代输出。示例:

python">children=soup.p.children
for i in children:print(i)

输出:

python">      Once upon a time there were three little sisters; and their names were<a class="sister" href="http://example.com/elsie" id="link1">
<span>Elsie</span>
</a><a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>and<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>and they lived at the bottom of a well.

(2)后代集

descendants获得后代集,返回的也是一个列表,操作与子集的children类似

案例:

python">for i,j in enumerate(soup.p.descendants):print(i,j)

(3)父集

parent,parents,前者获得a节点的父节点,获得一个直接父节点的全部内容。后者遍历所有父节点,返回一个列表。

parent案例

获得a节点的父节点:

python">print(soup.a.parent)

parents案例:

获得a节点的所有父节点:

python">soup.a.parents

 返回是一个列表,所以要对值操作也需要迭代,代码不再赘述。

(4)兄弟节点

next_sibling,previous_sibling。前者是获得下一个兄弟节点,后者是获得前一个兄弟节点。

next_siblings,previous_siblings。前者是获得当前节点的后面所有的兄弟节点,后者是获得当前节点的前面所有的兄弟节点,也是返回一个列表,操作值方式与上述迭代相同,代码不再赘述。

案例:

获取a标记的下一个兄弟节点

python">print(soup.a.next_sibling)

其他方法使用方法相同。

2、方法选择器

(1)方法

  1. find() 和 find_all()

    这两个方法都接受多个参数来指定搜索条件,比如标签名(name)、属性(attrs)、文本内容(string)等。

    • find(name=None, attrs={}, recursive=True, string=None, **kwargs):返回文档中符合条件的第一个元素。
    • find_all(name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs):返回文档中所有符合条件的元素,并生成一个列表。
  2. find_parent() 和 find_parents()

    这两个方法用于向上遍历DOM树来查找父元素。

    • find_parent(name=None, attrs={}, string=None, limit=None, **kwargs):返回当前元素的第一个匹配父元素。
    • find_parents(name=None, attrs={}, string=None, limit=None, recursive=True, **kwargs):返回当前元素的所有匹配父元素,并生成一个列表。
  3. find_next() 和 find_next_siblings()

    这两个方法用于查找当前元素之后的元素。

    • find_next(name=None, attrs={}, string=None, **kwargs):返回文档中当前元素之后的第一个匹配元素。
    • find_next_siblings(name=None, attrs={}, string=None, limit=None, **kwargs):返回当前元素之后的所有匹配兄弟元素,并生成一个列表。
  4. find_previous() 和 find_previous_siblings()

    这两个方法用于查找当前元素之前的元素。

    • find_previous(name=None, attrs={}, string=None, **kwargs):返回文档中当前元素之前的第一个匹配元素。
    • find_previous_siblings(name=None, attrs={}, string=None, limit=None, **kwargs):返回当前元素之前的所有匹配兄弟元素,并生成一个列表。
  5. select()

    • select(selector, namespaces=None, limit=None, **kwargs):使用CSS选择器语法来查找元素,并返回一个列表。这是基于lxml的CSS选择器实现,提供了强大的选择能力。

(2)属性说明

find() 方法

  • name:字符串或正则表达式,用于指定要查找的标签名。如果传递的是字符串,则会在文档中查找所有该名称的标签;如果传递的是正则表达式,则会查找所有匹配该正则表达式的标签名。
  • attrs:字典,用于指定一个或多个属性及其值,作为查找条件。例如,attrs={"class": "header"} 会查找所有class属性值为"header"的元素。
  • recursive:布尔值,默认为True。如果为True,则Beautiful Soup会递归地通过文档的子孙节点来查找元素;如果为False,则只在当前节点的直接子节点中查找。
  • string:字符串或正则表达式,用于指定要查找的文本内容。如果传递的是字符串,则会在文档中查找所有包含该文本的元素;如果传递的是正则表达式,则会查找所有文本内容匹配该正则表达式的元素。
  • limit:这个参数实际上在find()方法中不常用,因为它主要用于find_all()方法,以限制返回元素的数量。但在某些版本的Beautiful Soup中,如果传递了limit参数给find(),它可能会被忽略,因为find()默认只返回第一个匹配的元素。
  • kwargs:可以接受其他关键字参数,这些参数会作为属性来查找元素。例如,id="link1" 可以直接作为 find(id="link1") 来调用。

find_all() 方法

  • nameattrsrecursivestring:这些参数的含义与find()方法相同,但find_all()会返回所有匹配的元素,而不是仅仅第一个。
  • limit:整数,用于限制返回元素的数量。如果文档中有超过limit个元素匹配给定的条件,则find_all()只会返回前limit个元素。

http://www.ppmy.cn/ops/117829.html

相关文章

STM32CUBEIDE FreeRTOS操作教程(五):mutex互斥信号量

STM32CUBEIDE FreeRTOS操作教程&#xff08;五&#xff09;&#xff1a;mutex互斥信号量 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&am…

足球预测模型理论:足球数据分析——XGBoost算法实战

简介&#xff1a;本文将探讨如何使用XGBoost算法进行足球数据分析&#xff0c;特别是足球运动员身价估计。我们将通过实例和生动的语言&#xff0c;解释XGBoost算法的原理和实际应用&#xff0c;帮助读者理解复杂的技术概念&#xff0c;并提供可操作的建议和解决问题的方法。 足…

确保 App 跟踪透明度权限:Flutter 中的实践

确保 App 跟踪透明度权限&#xff1a;Flutter 中的实践 在数字广告领域&#xff0c;用户隐私保护已成为一个重要议题。随着 iOS 14 的发布&#xff0c;Apple 引入了 App Tracking Transparency (ATT) 框架&#xff0c;要求开发者在跟踪用户行为以提供个性化广告之前必须获得用…

对c语言中的指针进行深入全面的解析

1.普通的指针: 实际上指针就是存放地址的变量&#xff0c;eg: int a10; int *p&a; 拆分一下int *中的*说明p是一个指针&#xff0c;int是它所指向的类型&#xff1b; 2.字符串指针和字符串数组 char*str1"abcd"; 先看这一个&#xff0c;这个就是一个字符串…

金融EDI:你需要了解的银行与金融EDI的所有信息

对于银行和金融机构而言&#xff0c;对风险持谨慎态度是很正常的。任何需要将现有记录转换为新格式的新技术都可能会存在导致错误的情况。错误会带来不稳定性&#xff0c;银行始终权衡更快更高效的承诺以及出现损失的可能性。 然而&#xff0c;随着支付技术的不断发展&#xf…

统信服务器操作系统【qcow2 镜像空间扩容】方案

使用 qcow2 镜像安装系统,当默认安装系统存储空间不够用时,进行自定义扩容 文章目录 准备环境扩容步骤一、检查环境信息1.查看镜像信息2.查看镜像分区信息3.确认需要扩容的分区名二、扩容1.备份镜像2.创建新的镜像文件,并指定空间3.将系统扩容到新的镜像三、扩容 lvm 分区四…

视频单目标跟踪研究

由于对视频单目标跟踪并不是很熟悉&#xff0c;所以首先得对该领域有个大致的了解。 视频目标跟踪是计算机视觉领域重要的基础性研究问题之一&#xff0c;是指在视频序列第一帧指定目标 后&#xff0c;在后续帧持续跟踪目标&#xff0c;即利用边界框&#xff08;通常用矩形框表…

Kubernetes 配置管理

一、什么是 ConfigMap&#xff1f; 在传统架构中&#xff0c;配置文件往往被保存在宿主机上&#xff0c;程序启动是可以指定某个配置文件&#xff0c;但是使用容器部署时&#xff0c;容器所在的节点并不固定&#xff0c;所以不能使用这种方式&#xff0c;此处在构建镜像时&…