У меня есть процесс ожидания, который извлекает элементы из html документов, использующих стандарт xbrli xml.
И пример документа можно найти здесь :
Процесс работает хорошо (я использую многопроцессорную работу для параллельной работы), но у меня есть ~ 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: префикс 'a' не найден в карте префиксов
Синтаксический анализ XML с пространством имен в Python через '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)
Все ничего не возвращают - они не входят в l oop. Я ясно понял что-то очень неправильное в моем понимании того, как использовать структуру elementree против BS, но я не совсем знаю, как перейти от одного к другому.
Любые предложения приветствуются.