причина ваших проблем
У вас есть 18 списков, которые все пусты, поэтому вы не видите никакого эффекта на базу данных после вставки.
Я не могу найти, где я ошибся.
Ваши проблемы проистекают из недоразумения по поводу использования findall()
:
Element.findall()
находит только элементы с тегом, которые являются прямыми
дочерние элементы текущего элемента.
Итак, позвольте мне взять ticker
в качестве примера:
ticker = dom.findall('TICKER')
Что такое dom
? Он просто указывает на корневой элемент вашего XML-дерева, который в вашем случае равен collection
:
>>> dom
<Element 'collection' at 0x7f5e24a42e10>
Теперь спросите себя: каковы прямые элементы коллекции? Вы видите, что есть 6 INFO
прямых дочерних элементов и абсолютно нет TICKER
элемента.
>>> infos = dom.findall('INFO')
>>> len(infos)
6
Поэтому, когда вы запускаете ticker = dom.findall('TICKER')
, вы просто ищете прямых потомков коллекции, которые называются TICKER
, и, так как их нет, ваш список ticker
пуст.
>>> ticker = dom.findall('TICKER')
>>> ticker
[]
Итак, позже в вашем коде, когда вы запустите это: ticker_list = [t.text for t in ticker]
вы просто зацикливаетесь на пустом списке, и вы ничего не получаете из ничего, я имею в виду:
>>> ticker_list = [t.text for t in tickers]
>>> ticker_list
[]
Теперь примените эту аргументацию к 8 оставшимся первым спискам с соответствующими им 8 списками во второй части вашего кода.
Как исправить проблемы?
Как решить вашу проблему тогда? Что ж, если вы поняли то, что я объяснил выше, вы уже на полпути к решению ваших проблем. Давайте сделаем это:
После загрузки вашего XML-файла в dom
, инициализируйте 9 пустых списков, которые вам нужны:
>>> ticker_list = []
>>> name_list = []
>>> add_list = []
>>> phn_list = []
>>> site_list = []
>>> sec_list = []
>>> ind_list = []
>>> emp_list = []
>>> sum_list = []
Затем переберите свои данные, учитывая их иерархию и принципы работы findall()
. Например, давайте сосредоточимся на ticker_list
:
>>> dom
<Element 'collection' at 0x7f5e24a42e10>
>>> infos = dom.findall('INFO')
>>> for info in infos:
... tickers = info.findall('TICKER')
... for ticker in tickers:
... ticker_list.append(ticker.text)
...
>>> ticker_list
['AAPL', 'T', 'IBM', 'TWTR', 'TSLA', 'PYPL']
Теперь выполните ту же логику для остальных 8 списков, которые вы ищете:
>>> infos = dom.findall('INFO')
>>> for info in infos:
... tickers = info.findall('TICKER')
... for ticker in tickers:
... ticker_list.append(ticker.text)
... names = info.findall('NAME')
... for name in names:
... name_list.append(name.text)
... adds = info.findall('ADDRESS')
... for add in adds:
... add_list.append(add.text)
... phns = info.findall('PHONE')
... for phn in phns:
... phn_list.append(phn.text)
... sites = info.findall('WEBSITE')
... for site in sites:
... site_list.append(site.text)
... secs = info.findall('SECTOR')
... for sec in secs:
... sec_list.append(sec.text)
... inds = info.findall('INDUSTRY')
... for ind in inds:
... ind_list.append(ind.text)
... emps = info.findall('FULL_TIME')
... for emp in emps:
... emp_list.append(emp.text)
... sums = info.findall('BUS_SUMM')
... for sum in sums:
... sum_list.append(sum.text)
Теперь в ваших списках есть данные, и вставка должна работать успешно.
Дополнительное примечание:
Конечно, iter
значительно упростит код, чем при использовании findall()