python - 从 xml 文件中检索数据到 mysql 数据库
问题描述
我必须从 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 个列表都是空的,这就是为什么您在插入后看不到对数据库有任何影响的原因。
我无法找到我出错的地方。
您的问题源于对如何使用的误解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()
推荐阅读
- python - 与 h5py 和 create_dataset 相关的问题
- typescript - 使用带有 @usedapp 和 @ethersproject/contracts 的智能合约的奇怪错误
- list - 太多信息
- apache-camel - 骆驼http4 websphere sslcontextparameters
- jenkins-plugins - Jenkins 插件 UI 表单:在 Jelly 文件中,如何将其他字段传递给自动完成 url 以进行文本框输入?
- python - RNN 模型错误:“ValueError:此模型尚未构建。”
- node.js - 角度模块可以具有较低角度版本的 peerDependency 吗?
- r - 在 Shiny App 中嵌入图像;无法成功显示图片
- jenkins - Jenkins 代理自动运行 Ranorex 测试
- apache-spark - 用 Null\0 填充所有列上缺失信息的最佳方法是什么?