Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • python 学习指南
  • python 中的设计模式
  • module

    • python modules
    • pandas
    • numpy
    • matplotlib
    • scipy
    • python typing 模块
    • inspect
    • beautysoup
      • 介绍
      • 获取子元素
        • href 正则
      • 获取父元素
      • 获取兄弟节点
    • scrapy
    • splash
    • pytorch
  • tool

  • other

  • 《python》
  • module
Jacky
2023-06-13
目录

beautysoup

# 介绍

BeautifulSoup 是一个 Python 库, 用于解析 HTML 和 XML 文档, 以提取其中的数据。它专注于页面解析和数据提取, 但不提供完整的爬虫框架。

BeautifulSoup 使数据解析更容易, 因为它提供了简单的 API, 可以轻松地遍历文档树并提取所需的信息。BeautifulSoup 适用于小型或中型的网页解析和数据提取任务

通常 Scrapy 和 BeautifulSoup 一起使用, Scrapy 用于构建和管理爬虫, 负责抓取网页并将其传递给 BeautifulSoup, 然后 BeautifulSoup 用于解析和提取所需的数据。这种组合允许你充分利用 Scrapy 的爬虫功能和 BeautifulSoup 的数据解析功能

在选择使用 Scrapy 还是 BeautifulSoup 时, 取决于你的具体需求。如果你需要构建一个完整的爬虫应用, Scrapy 可能更适合。如果你只需要解析和提取特定网页的数据, 那么 BeautifulSoup 可能足够了。另外, 还可以考虑使用 Scrapy 的扩展, 如 Scrapy-BeautifulSoup, 以在 Scrapy 中使用 BeautifulSoup 来解析页面

# 获取子元素

使用 BeautifulSoup, 你可以使用 .find() 方法来获取指定节点的第一个子元素

假设你已经将 HTML 文档解析为 BeautifulSoup 对象, 并且你有一个名为 sublineDom 的节点, 你可以使用以下方式获取它的第一个子元素:

first_child = sublineDom.find()
1

上述代码中的 .find() 方法没有传递任何参数, 这将返回 sublineDom 的第一个子元素。如果你希望通过标签名或其他属性来选择子元素, 可以将相应的参数传递给 .find() 方法

例如

  1. 如果你要获取 sublineDom 的第一个 <div> 子元素, 可以使用以下代码:
first*div = sublineDom.find("div")
1
  1. 如果你希望获取具有特定类名的子元素, 可以传递 class\* 参数:
first*child_with_class = sublineDom.find(class*="my-class")
1

请注意, .find() 方法只返回找到的第一个匹配的子元素。如果你想获取所有匹配的子元素, 可以使用 .find_all() 方法

  1. 获取子元素的最后一个节点
all_children = sublineDom.find_all()

if all_children:
    last_child = all_children[-1]
    print(last_child)
else:
    print("sublineDom 没有子元素节点")
1
2
3
4
5
6
7

# href 正则

使用正则表达式匹配 href 属性的值, 以查找满足特定格式的链接。re.compile(r'user?id=') 将会编译一个正则表达式对象, 匹配以 user?id= 开头的 href 值

sublineDom.find("a", href=re.compile(r'user\?id='))
1

通过将选择器参数设置为 a 标签, 并将 href 属性与正则表达式进行匹配, 我们可以定位到所需的节点

# 获取父元素

如果你想要在 BeautifulSoup 中进行反向搜索, 即从一个节点向上搜索其父节点、祖先节点等, 可以使用 .find_parents() 或 .find_parent() 方法。)

.find_parents() 方法返回一个迭代器, 用于按顺序返回所有父节点和祖先节点。你可以对迭代器进行循环遍历来处理这些节点

以下是一个示例代码, 展示了如何使用 .find_parents() 方法进行反向搜索:

for parent in sublineDom.find_parents():
    print(parent)
1
2

上述代码将打印出 sublineDom 节点的所有父节点和祖先节点

如果你只想获取第一个父节点或祖先节点, 可以使用 .find_parent() 方法:

parent = sublineDom.find_parent()
print(parent)
1
2

上述代码将返回 sublineDom 的第一个父节点或祖先节点

需要注意的是, 这些方法会返回与搜索条件匹配的节点, 如果你想要进一步筛选结果, 可以使用参数来指定标签名、类名等属性

# 获取兄弟节点

.find_next_sibling() 方法来获取当前节点的下一个兄弟节点

以下是使用 .find_next_sibling() 方法的示例代码:

next_sibling = sublineDom.find_next_sibling()
1

上述代码中的 .find_next_sibling() 方法没有传递任何参数, 它将返回 sublineDom 的下一个兄弟节点。如果 sublineDom 没有下一个兄弟节点, 则返回 None

如果你希望通过标签名或其他属性来选择下一个兄弟节点, 可以将相应的参数传递给 .find_next_sibling() 方法

例如, 如果你要获取 sublineDom 的下一个 <div> 兄弟节点, 可以使用以下代码:

next*div_sibling = sublineDom.find_next_sibling("div")
1

如果你希望获取具有特定类名的下一个兄弟节点, 可以传递 class\* 参数:

next*sibling_with_class = sublineDom.find_next_sibling(class*="my-class")
1

请注意, .find_next_sibling() 方法只返回找到的第一个匹配的兄弟节点。如果你想获取所有匹配的兄弟节点, 可以使用 .find_next_siblings() 方法

上次更新: 2025/10/09, 23:53:03
inspect
scrapy

← inspect scrapy→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式