为何BeautifulSoup无法识别XBRL相关的ix:nonfraction标签?
问题:为什么
find_all('ix')找不到<ix:nonfraction>标签? 核心差异与原因
- 第一个代码里的
<ix:nonfraction>是带XML命名空间的标签:ix:是命名空间的前缀,nonfraction才是真正的标签名,和纯<ix>标签完全是两个不同的元素。 - BeautifulSoup处理带命名空间的XML/HTML时,会将标签解析成
(命名空间URI, 标签名)的元组结构。直接用find_all('ix')只会匹配标签名为ix的普通元素,无法匹配带ix:前缀的nonfraction标签。 - 第二个代码里的
<ix>是普通HTML标签,标签名就是ix,所以find_all('ix')能直接命中。
解决方案
1. 直接查找完整标签名
如果目标明确是<ix:nonfraction>,直接用完整标签字符串查找:
from bs4 import BeautifulSoup text = """ <td style="BORDER-BOTTOM:0.75pt solid #7f7f7f;white-space:nowrap;vertical-align:bottom;text-align:right;">$ <ix:nonfraction name="ecd:AveragePrice" contextref="P01_01_2022To12_31_2022" unitref="Unit_USD" decimals="2" scale="0" format="ixt:num-dot-decimal">97.88</ix:nonfraction> </td> """ soup = BeautifulSoup(text, 'lxml') ix_tags = soup.find_all('ix:nonfraction') print(ix_tags) # 会输出找到的<ix:nonfraction>标签
2. 正则匹配所有ix:前缀的标签
如果要批量查找所有带ix:前缀的标签,用正则表达式匹配标签名:
import re from bs4 import BeautifulSoup text = """ <td style="BORDER-BOTTOM:0.75pt solid #7f7f7f;white-space:nowrap;vertical-align:bottom;text-align:right;">$ <ix:nonfraction name="ecd:AveragePrice" contextref="P01_01_2022To12_31_2022" unitref="Unit_USD" decimals="2" scale="0" format="ixt:num-dot-decimal">97.88</ix:nonfraction> </td> """ soup = BeautifulSoup(text, 'lxml') ix_tags = soup.find_all(re.compile(r'^ix:')) print(ix_tags)
3. 利用命名空间映射查找(推荐规范做法)
如果文档里声明了ix对应的命名空间URI(通常是http://www.xbrl.org/2003/instance),可以用select方法结合命名空间映射:
from bs4 import BeautifulSoup text = """ <td style="BORDER-BOTTOM:0.75pt solid #7f7f7f;white-space:nowrap;vertical-align:bottom;text-align:right;">$ <ix:nonfraction name="ecd:AveragePrice" contextref="P01_01_2022To12_31_2022" unitref="Unit_USD" decimals="2" scale="0" format="ixt:num-dot-decimal">97.88</ix:nonfraction> </td> """ soup = BeautifulSoup(text, 'lxml') # 定义命名空间映射,URI以实际文档声明为准 namespaces = {'ix': 'http://www.xbrl.org/2003/instance'} ix_tags = soup.select('ix|nonfraction', namespaces=namespaces) print(ix_tags)
内容的提问来源于stack exchange,提问作者Victor Wang
相关产品推荐
相关产品推荐

