【发布时间】:2020-04-16 10:29:12
【问题描述】:
我有一个现有的过程,可以从使用 xbrli xml 标准的 html 文档中提取元素。
并且可以找到文档示例here:
该过程运行良好(我正在使用多处理并行工作)但我有大约 20m html 和 xml 文件要处理,我发现 beautifulsoup 是核心瓶颈。
我将 htmlelement 视为提取所需数据的一种希望更快的替代方法,但我正在努力寻找元素。例如,在 BS 中,我可以执行以下操作:
for tag in soup.find_all('xbrli:unit'):
l_unitid = tag.attrs.get('id')
l_value = tag.text
l_unit_dict[l_unitid] = {'unitid':l_unitid,'value':l_value}
这将找到所有 xbrli:unit 标签,我可以轻松提取它们的值。
但是,当我在 htmlelement 中尝试类似的操作时,会出现以下异常:
import htmlement
source = htmlement.parse("Prod223_2542_00010416_20190331.html")
for tag in source.iterfind('.//xbrli:unit'):
l_unitid = tag.attrs.get('id')
l_value = tag.text
print(l_unitid)
print(l_value)
SyntaxError: prefix 'xbrli' not found in prefix map
我在谷歌上搜索了几篇文章,但我似乎无法取得进展 SyntaxError: prefix 'a' not found in prefix map
Parsing XML with namespace in Python via 'ElementTree'
我尝试在命名空间映射中添加,但无论我把东西放在哪个方向,或者我在寻找什么标签,它都没有找到任何东西
source = htmlement.parse("Prod223_2542_00010416_20190331.html")
namespaces = {'xbrli': 'period'}
for tag in source.iterfind('.//xbrli:period',namespaces):
l_unitid = tag.attrs.get('id')
l_value = tag.text
namespaces = {'xbrli': 'period'}
for tag in source.iterfind('.//{xbrli}period',namespaces):
l_unitid = tag.attrs.get('id')
l_value = tag.text
print(l_unitid)
print(l_value)
namespaces = {'period':'xbrli'}
for tag in source.iterfind('.//{xbrli}period',namespaces):
l_unitid = tag.attrs.get('id')
l_value = tag.text
print(l_unitid)
print(l_value)
namespaces = {'period':'xbrli'}
for tag in source.iterfind('.//period',namespaces):
l_unitid = tag.attrs.get('id')
l_value = tag.text
print(l_unitid)
print(l_value)
所有都没有返回 - 他们不进入循环。我对如何使用 elementree 结构与 BS 的理解显然有一些非常错误的地方,但我不太清楚如何从一个转移到另一个。
欢迎提出任何建议。
【问题讨论】:
-
我有点困惑:你能编辑你的问题以显示你是如何获得
source的吗? -
@JackFleeting 抱歉,是的,我没有发现我错过了。现在就在里面
标签: xpath beautifulsoup elementtree