【问题标题】:BeaitifulSoup can't read all the namespacesBeaitifulSoup 无法读取所有命名空间
【发布时间】:2019-12-24 15:45:50
【问题描述】:

我有一个 XBRL 文档,它应该是一个 XML 文档。

我正在尝试提取按名称空间分组的不同标签。虽然代码似乎适用于某些命名空间 (us-gaap),但它似乎不适用于其他命名空间 (xbrli)。但是,在 xml 文件中有很多 * *

类型的标签

代码:

from bs4 import BeautifulSoup

with open('test.xml', 'r') as fp:
    raw_text = fp.read()

soup = BeautifulSoup(raw_text, 'xml')

print( len(soup.find_all(lambda tag: tag.prefix == 'us-gaap')) ) # print 941
print( len(soup.find_all(lambda tag: tag.prefix == 'xbrli')) ) # print 0

您可以找到test.xml file here

【问题讨论】:

  • 我无法复制这个。我正在使用您的代码获取 9411268 等值。
  • 请添加预期的结果输出

标签: python xml beautifulsoup namespaces xbrl


【解决方案1】:

你能试试这段代码吗(使用 CSS 选择器?)。使用您的代码,我有时会得到 1268 的 xbrli 标签,有时是 0(在旧版本的 bs4==4.4.1 上测试)。另外,您使用的是哪个版本的 BeautifulSoup?

from bs4 import BeautifulSoup, __version__

soup = BeautifulSoup(open('data.txt', 'r').read(), 'xml')

print('xbrli:* tags =', len(soup.select('xbrli|*')))
print('us-gaap:* tags =', len(soup.select('us-gaap|*')))

print('Version of bs4:', __version__)

打印:

xbrli:* tags = 1268
us-gaap:* tags = 941
Version of bs4: 4.8.1

【讨论】:

  • 即使我认为 Css 选择器将是最好的选择。但是,由于运行几次后我无法重现,如果关闭,我就离开了。但是很好的想法。+1
  • @KunduK 我已经在旧版本的 bs4 4.4.1 上测试了 OP 的代码,实际上,xbrli 标签的总和是(有时)0。所以我认为 OP 使用的是旧版本的bs4.
  • CSS 命名空间选择器支持直到 4.7.0 才添加了 soupsieve。
【解决方案2】:

使用 BeautifulSoup 4.8.1 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多