Python爬虫bs4基本使用

一、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个元素。
相关推荐
小艳加油4 分钟前
AI+Python近红外光谱分析机器学习与深度学习实战,覆盖提示词撰写、数据预处理、回归/神经网络/集成学习/迁移学习/可解释性可视化等
python·近红外光谱分析·多元线性回归
雪碧聊技术18 分钟前
手刃一个爬虫小案例
爬虫·第一个爬虫案例
JamSlade1 小时前
SSO登录验证设计要点细节(以微软 Microsoft SSO为例) 基于react python
python·react.js·microsoft
MediaTea2 小时前
Python 文件操作:JSON 格式
开发语言·windows·python·json
百锦再2 小时前
金仓数据库提出“三低一平”的迁移理念
开发语言·数据库·后端·python·rust·eclipse·pygame
野生工程师2 小时前
【Python爬虫基础-1】爬虫开发基础
开发语言·爬虫·python
力江2 小时前
攻克维吾尔语识别的技术实践(多语言智能识别系统)
人工智能·python·自然语言处理·语音识别·unicode·维吾尔语
诗句藏于尽头3 小时前
MediaPipe+OpenCV的python实现交互式贪吃蛇小游戏
人工智能·python·opencv
盼哥PyAI实验室3 小时前
Python 正则表达式实战 + 详解:从匹配QQ邮箱到掌握核心语法
python·mysql·正则表达式
木易 士心3 小时前
Android 开发核心技术深度解析
android·开发语言·python