You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在BeautifulSoup的find_all()中按标签id的Page前缀做部分条件筛选?

解决方案:按页码筛选XML中的<textblock>标签

嘿,这个需求其实很好实现,BeautifulSoup的find_all()方法支持多种灵活的筛选方式,刚好能满足你按页码分组提取<textblock>的需求。给你两种实用方案:

方案1:使用正则表达式匹配id属性

利用正则表达式精准匹配id属性的前缀(比如Page1_),就能直接筛选出对应页面的所有块:

import re
from bs4 import BeautifulSoup

# 假设你的XML内容存在table变量中
xml_soup = BeautifulSoup(table, 'lxml')
# 定义你要筛选的目标页码
target_page = "Page1"

# 用正则匹配以目标页码开头、紧跟下划线的id
text_blocks = xml_soup.find_all('textblock', id=re.compile(f'^{target_page}_'))

原理说明

re.compile(f'^{target_page}_')会生成一个正则规则,匹配以目标页码开头且后面紧跟下划线的id值,完美跳过后面的BlockN部分,精准定位该页面的所有<textblock>标签。

方案2:自定义筛选函数(更灵活)

如果你需要更复杂的筛选逻辑,或者不想依赖正则,可以用自定义函数作为find_all()的参数:

from bs4 import BeautifulSoup

xml_soup = BeautifulSoup(table, 'lxml')
target_page = "Page1"

def filter_textblocks_by_page(tag):
    # 先验证标签类型,再检查id前缀;无id属性时用空字符串避免报错
    return tag.name == 'textblock' and tag.get('id', '').startswith(f'{target_page}_')

# 传入自定义函数进行筛选
text_blocks = xml_soup.find_all(filter_textblocks_by_page)

原理说明

这个函数会先判断标签是否是<textblock>,再检查它的id属性是否以目标页码_开头,逻辑清晰且易于扩展——比如后续要加语言筛选,直接在函数里加判断条件就行。

两种方案都能轻松实现你的需求,你只需要替换target_page的值(比如"Page2"、"Page10")就能切换不同页面的筛选啦。

内容的提问来源于stack exchange,提问作者Dawny33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:17:43