[Web自动化] BeautifulSoup导航文档树

7.4 BeautifulSoup导航文档树

7.4.1 子节点和子孙节点

7.4.1.1 子节点
  • .contents :这是一个列表,包含了Tag对象的所有子节点。列表的第一个元素是Tag的第一个子节点,最后一个元素是最后一个子节点。如果Tag不包含任何内容,则.contents是一个空列表。
  • .children :这是一个生成器,用于迭代Tag的所有子节点。与.contents不同,.children不会一次性加载所有子节点到内存中,因此适用于处理大型文档。

示例

python 复制代码
from bs4 import BeautifulSoup

html_doc = "<p>First paragraph.<a href='http://example.com'>Link</a></p>"
soup = BeautifulSoup(html_doc, 'html.parser')

p_tag = soup.p
print(p_tag.contents)# 输出子节点的列表,如:['First paragraph.', <a href="http://example.com">Link</a>]

for child in p_tag.children:
 print(child)# 迭代输出每个子节点
7.4.1.2 子孙节点
  • .descendants:这是一个生成器,用于迭代Tag的所有子孙节点,即直接子节点、子节点的子节点等,直到最底层的节点。

示例

python 复制代码
for descendant in p_tag.descendants:
 print(descendant)# 迭代输出所有子孙节点,包括文本节点和标签

7.4.2 父节点和祖先节点

  • .parent :返回当前节点的直接父节点。如果节点是顶层节点(如整个文档的根节点),则返回None
  • .parents:这是一个生成器,返回当前节点的所有祖先节点,从直接父节点开始,一直到文档的根节点。

示例

python 复制代码
a_tag = soup.a
print(a_tag.parent)# 输出:<p>First paragraph.<a href="http://example.com">Link</a></p>

for parent in a_tag.parents:
 print(parent)# 迭代输出所有祖先节点

7.4.3 兄弟节点

  • .next_sibling.previous_sibling :分别返回当前节点的下一个和上一个兄弟节点。如果节点是最后一个或第一个兄弟节点,则返回None
  • .next_siblings.previous_siblings:这是两个生成器,分别迭代当前节点之后和之前的所有兄弟节点。

示例

python 复制代码
for sibling in a_tag.next_siblings:
 print(sibling)# 迭代输出<a>标签之后的所有兄弟节点(在这个例子中,可能没有输出,因为<a>是最后一个子节点)
# 假设我们有一个更复杂的结构来演示.previous_sibling
html_doc = "<p>Text before <a href='http://example.com'>Link</a> Text after</p>"
soup = BeautifulSoup(html_doc, 'html.parser')
a_tag = soup.a
print(a_tag.previous_sibling)# 输出:Text before (注意,这可能包括额外的空格或换行符,具体取决于HTML文档的格式)

# 对于.previous_siblings,这里没有直接的前一个兄弟节点可以展示,但如果有,可以类似地迭代它们

请注意,兄弟节点之间的空格、换行符等也可能被视为NavigableString对象,因此在遍历兄弟节点时可能会遇到它们。此外,实际的输出可能取决于HTML文档的格式和解析器的实现细节。

相关推荐
浮尘笔记2 小时前
Java Snowy框架CI/CD云效自动化部署流程
java·运维·服务器·阿里云·ci/cd·自动化
一点一木7 小时前
深度体验TRAE SOLO移动端7天:作为独立开发者,我把工作流揣进了兜里
前端·人工智能·trae
天外飞雨道沧桑8 小时前
TypeScript 中 omit 和 record 用法
前端·javascript·typescript
Lee川8 小时前
mini-cursor 揭秘:从 Tool 定义到 Agent 循环的完整实现
前端·人工智能·后端
测试修炼手册8 小时前
[测试工具] 用 Codex 做测试实战:从需求分析到自动化用例落地
运维·自动化·需求分析
canonical_entropy9 小时前
从 Spec-Driven Development 到 Attractor-Guided Engineering
前端·aigc·ai编程
研☆香9 小时前
聊聊前端页面的三种长度单位
前端
2301_803934619 小时前
Go语言如何做网络爬虫_Go语言爬虫开发教程【指南】
jvm·数据库·python
WL_Aurora9 小时前
Python爬虫实战(六):新发地蔬菜价格数据采集.
爬虫·python
盲敲代码的阿豪9 小时前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python