Skip to main content
 首页 » 编程设计

python之从xml文件中检索数据到mysql数据库

2024年12月31日24mengfanrong

我必须从 xml 文件中检索数据并输入数据库。当我运行我的 python 文件时没有错误,但数据没有进入数据库。我无法找到我哪里出错了。如果有人可以帮助我,那将非常有帮助。

这是我的python代码,

from xml.etree import ElementTree 
import mysql.connector 
 
dom = ElementTree.parse('profile.xml') 
 
ticker = dom.findall('TICKER') 
name = dom.findall('NAME') 
address = dom.findall('ADDRESS') 
phone = dom.findall('PHONE') 
website = dom.findall('WEBSITE') 
sector = dom.findall('SECTOR') 
industry = dom.findall('INDUSTRY') 
full_time = dom.findall('FULL_TIME') 
bus_summ = dom.findall('BUS_SUMM') 
 
ticker_list = [t.text for t in ticker] 
name_list = [t.text for t in name] 
add_list = [t.text for t in address] 
phn_list = [t.text for t in phone] 
site_list = [t.text for t in website] 
sec_list = [t.text for t in sector] 
ind_list = [t.text for t in industry] 
emp_list = [t.text for t in full_time] 
sum_list = [t.text for t in bus_summ] 
 
db = mysql.connector.Connect(host = 'localhost', user = 'root', password ='root' , database = 'nldb_project') 
cur = db.cursor() 
query = "INSERT INTO profiles(`prof_ticker`,`name`,`address`,`phonenum`,`website`,`sector`,`industry`,full_time`,`bus_summ`) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)" 
 
sqltuples = [(t,n,a,p,s,sec,i,e,su) for t,n,a,p,s,sec,i,e,su in zip(ticker_list,name_list,add_list,phn_list,site_list,sec_list,ind_list,emp_list,sum_list)] 
cur.executemany(query,sqltuples) 

我使用的是 python 3.6.5 版本。

这是我的xml代码,

<?xml version="1.0"?> 
<collection shelf = 'profile'> 
<INFO> 
    <TICKER>AAPL</TICKER> 
    <NAME> Apple Inc.</NAME> 
    <ADDRESS>1 Infinite Loop;Cupertino, CA 95014;United State</ADDRESS> 
    <PHONE>408-996-1010</PHONE> 
    <WEBSITE>http://www.apple.com</WEBSITE> 
    <SECTOR>Technology</SECTOR> 
    <INDUSTRY>Consumer Electronics</INDUSTRY> 
    <FULL_TIME>100,000</FULL_TIME> 
    <BUS_SUMM>Apple</BUS_SUMM> 
    <SOURCE>https://finance.yahoo.com/quote/AAPL/profile?p=AAPL</SOURCE>  
</INFO> 
<INFO> 
    <TICKER>T</TICKER> 
    <NAME> AT and T Inc.</NAME> 
    <ADDRESS>208 South Akard Street;Dallas, TX 75202;United States</ADDRESS> 
    <PHONE>210-821-4105</PHONE> 
    <WEBSITE>http://www.att.com</WEBSITE> 
    <SECTOR>Communication Services</SECTOR> 
    <INDUSTRY> Telecom Services</INDUSTRY> 
    <FULL_TIME>254,000</FULL_TIME> 
    <BUS_SUMM>at and t</BUS_SUMM> 
    <SOURCE>https://finance.yahoo.com/quote/T/profile?p=T</SOURCE> 
</INFO> 
<INFO> 
    <TICKER>IBM</TICKER> 
    <NAME>International Business Machines Corporation</NAME> 
    <ADDRESS>1 New Orchard Road;Armonk, NY 10504;United States</ADDRESS> 
    <PHONE>914-499-1900</PHONE> 
    <WEBSITE>http://www.ibm.com</WEBSITE> 
    <SECTOR>Technology</SECTOR> 
    <INDUSTRY> Information Technology Services</INDUSTRY> 
    <FULL_TIME>366,600</FULL_TIME> 
    <BUS_SUMM>ibm</BUS_SUMM> 
    <SOURCE>https://finance.yahoo.com/quote/IBM/profile?p=IBM</SOURCE> 
</INFO> 
<INFO> 
    <TICKER>TWTR</TICKER> 
    <NAME>Twitter,Inc.</NAME> 
    <ADDRESS>1355 Market Street;Suite 900;San Francisco, CA 94103;United States</ADDRESS> 
    <PHONE>415-222-9670</PHONE> 
    <WEBSITE>http://www.twitter.com</WEBSITE> 
    <SECTOR>Technology</SECTOR> 
    <INDUSTRY>Internet Content Information</INDUSTRY> 
    <FULL_TIME>3,372</FULL_TIME> 
    <BUS_SUMM>twitter</BUS_SUMM> 
    <SOURCE>https://finance.yahoo.com/quote/TWTR/profile?p=TWTR</SOURCE> 
</INFO> 
<INFO> 
    <TICKER>TSLA</TICKER> 
    <NAME>Tesla,Inc.</NAME> 
    <ADDRESS>3500 Deer Creek Road;Palo Alto, CA 94304;United States</ADDRESS> 
    <PHONE>650-681-5000</PHONE> 
    <WEBSITE>http://www.tesla.com</WEBSITE> 
    <SECTOR>Consumer Cyclical</SECTOR> 
    <INDUSTRY>Auto Manufacturers</INDUSTRY> 
    <FULL_TIME>37,543</FULL_TIME> 
    <BUS_SUMM>tesla</BUS_SUMM> 
    <SOURCE>https://finance.yahoo.com/quote/TSLA/profile?p=TSLA</SOURCE> 
</INFO> 
<INFO> 
    <TICKER>PYPL</TICKER> 
    <NAME>PayPal Holdings, Inc.</NAME> 
    <ADDRESS>2211 North First Street;San Jose, CA 95131;United States</ADDRESS> 
    <PHONE>408-967-1000</PHONE> 
    <WEBSITE>http://www.paypal.com</WEBSITE> 
    <SECTOR>Financial Services</SECTOR> 
    <INDUSTRY>Credit Services</INDUSTRY> 
    <FULL_TIME>18,700</FULL_TIME> 
    <BUS_SUMM>paypal</BUS_SUMM> 
    <SOURCE>https://finance.yahoo.com/quote/PYPL/profile?p=PYPL</SOURCE> 
</INFO> 
</collection> 

请您参考如下方法:

问题背后的原因

你有 18 个列表,它们都是空的,这就是为什么你在插入后看不到对数据库有任何影响。

I am unable to find where I went wrong.

您的问题源于对如何使用的误解 findall() :

Element.findall() finds only elements with a tag which are direct children of the current element.

所以让我以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()

时更简化代码