Python爬虫bs4基本使用

news/2024/9/28 17:21:27/

一、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/news/1531575.html

相关文章

QT QLineEdit 控件输入验证

QT QLineEdit 控件输入验证 一、格式掩码 void setInputMask(const QString &inputMask);     使 QLineEdit 控件只允许输入自定义的格式字符串,具体自定义组合用到的字符如下: A ASCII 字母。A-Z、a-z&#xff1b;不可用空格填充。 a ASCII 字母。A-Z、a-z&#x…

基于微信小程序爱心领养小程序设计与实现(源码+参考文档+定制开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

SSM超市售卖管理系统-计算机毕业设计源码23976

目 录 摘要 Abstract 1 绪论 1.1研究的背景和意义 1.2研究内容 1.3论文结构与章节安排 2 开发技术介绍 2.1 SSM框架 2.2 MySQL数据库 3 超市售卖管理系统系统分析 3.1 可行性分析 3.2 系统流程分析 3.2.1 数据流程 3.3.2 业务流程 3.3 系统功能分析 3.3.1 功…

DERT目标检测源码流程图main.py的执行

DERT目标检测源码流程图main.py的执行 官网预测脚本 补充官网提供的预测部分的代码信息。 from PIL import Image import requests import matplotlib.pyplot as pltimport torch from torch import nn from torchvision.models import resnet50 import torchvision.transform…

力扣题解2207

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;中等&#xff09;​&#xff1a; 字符串中最多数目的子序列 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern &#xff0c;两者都只包…

【计算机视觉】YoloV8-训练与测试教程

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 制作数据集 Labelme 数据集 数据集选用自己标注的&#xff0c;可参考以下&#xff1a…

HTML·第三章课后练习题

采用表格布局完成“CASIO计算器”外观设计&#xff0c;其中表格的每一个单元格均需要设计带边框 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…

【R语言】fs 工具功能速查

文件操作 文件操作函数作用file_copy() dir_copy() link_copy()复制文件、目录、链接file_create() dir_create() link_create()创建文件、目录、链接file_delete() dir_delete() link_delete()删除文件、目录、链接file_access() file_exists() dir_exists() link_exists()文…