当前位置: 首页 > article >正文

Python爬虫bs4基本使用

一、bs4

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

(1)子集:

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

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

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标签的子集:

print(soup.p.contents)

输出:

['\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    

 

 或:

soup.p.children

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

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

输出:

      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类似

案例:

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

(3)父集

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

parent案例

获得a节点的父节点:

print(soup.a.parent)

parents案例:

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

soup.a.parents

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

(4)兄弟节点

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

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

案例:

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

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.kler.cn/a/324408.html

相关文章:

  • 数据分析-Excel基础操作
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页
  • 网络安全之WINDOWS端口及病毒编写
  • 记录一下跨域的问题,讲讲跨域
  • CondaError: Run ‘conda init‘ before ‘conda activate‘解决办法
  • AdaBoost 二分类问题
  • Java编程基础:类与对象的探索之旅
  • C++学习笔记----8、掌握类与对象(一)---- 对象中的动态内存分配(6)
  • 【球形空间产生器】
  • 解决 Java 中由于 parallelStream 导致的死锁
  • BUG项目管理
  • 【MAC】安装realsense
  • HttpServletRequest简介
  • 美团中间件C++一面-面经总结
  • 25维谛技术面试最常见问题面试经验分享总结(包含一二三面题目+答案)
  • 基于两分支卷积和 Transformer 的轻量级多尺度特征融合超分辨率网络 !
  • 如何组织一场考试并筛选未参加答题的考生?
  • 搜索:如何用 A*搜索算法实现游戏中的寻路功能?
  • Python脚本示例,你可以使用这个脚本来自动化登录网站、选择页面元素和提交表单
  • 『网络游戏』GoLand服务器框架【01】
  • 第 2 章:Vue 组件化编程
  • Cluster Explanation via Polyhedral Descriptions
  • 【性能优化】低配starRocks常驻内存优化
  • py-mmcif提取结构解析的方法、提交日期以及pdb ID等
  • 基于Node.js+Express+MySQL+VUE实现的在线电影视频点播网站管理系统的设计与实现部署安装
  • Kubernetes服务发布基础