如何在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
相关产品推荐
相关产品推荐

