我尝试使用python与数据库来显示一系列信息。 但是,我的输出只显示最后一列。 我知道我不是很清楚地表达我的意思。 所以,我把我的代码和输出如下: 现在输出显示:
$ python pricewatch.py
Harvey Norman Site Search
iPad 2 Wi-Fi 16GB Black
iPad 2 Wi-Fi 16GB
iPad mini Wi-Fi + Cellular 32GB
iPad mini Wi-Fi 16GB
iPad mini Wi-Fi + Cellular 64GB
iPad Wi-Fi 64GB with Retina Display
iPad Wi-Fi 32GB with Retina Display
iPad 2 Wi-Fi 16GB White
iPad 2 Wi-Fi + 3G 16GB
iPad Wi-Fi + Cellular 32GB with Retina Display
iPad mini Wi-Fi + Cellular 16GB
$357
$697
$756
$647
$395
$545
$777
$487
(8, u'iPad mini Wi-Fi + Cellular 16GB', u'Harvey Norman Site Search', u'$487')
//如您所见,它只显示最后一个 我的代码是
url="http://m.harveynorman.com.au/computers/tablets-readers/ipads"
page=urllib2.urlopen(url)
soup = BeautifulSoup(page.read())
sitename=soup.find('label',{'for':'search'})
print sitename.renderContents()
productname=soup.findAll('strong',{'class':'name fn'})
for eachproductname in productname:
print eachproductname.renderContents()
productprice=soup.findAll('span',{'class':'price'})
for eachproductprice in productprice:
print eachproductprice.renderContents().replace("<span>","").replace("</span>","")
conn =sqlite3.connect('pricewatch.db')
c = conn.cursor()
c.execute("CREATE TABLE if not exists table1 (id integer, name text, store text, price real)")
eachname = eachproductname.renderContents()
eachprice = eachproductprice.renderContents().replace("<span>","").replace("</span>","")
sitename = sitename.renderContents()
assignnumber = randint(1,30) #issue here,want to assign a series of number by the scriptself
data = [(assignnumber,eachname,sitename,eachprice),
]
c.executemany('INSERT INTO table1 VALUES (?,?,?,?)',data)
#output
for row in c.execute('select * from table1'):
print row
现在,我希望从数据库得到的输出就像 (1,ipadXX,HN,$ 199页) (2,ipad xx,NH,$ 200) .....
希望任何人都可以提供提示或编辑我的剧本。
问候 宇航
答案 0 :(得分:3)
没有错:
for row in c.execute('select * from table1'):
print row
请确保先提交插入内容:
c.executemany('INSERT INTO table1 VALUES (?,?,?,?)',data)
conn.commit()
然后您仍然可以逐个拉取记录,而不是像fetchall()
那样一次检索所有行。
答案 1 :(得分:1)
您应该在fetchall
之后致电execute
:
for row in c.execute("select * from table1").fetchall():
print(row)
答案 2 :(得分:0)
@jon Clements是对的,你的问题在这里:
data = [(assignnumber,eachname,sitename,eachprice),
]
需要处于循环中 - 现在它只被分配了第一组值,而这就是所有要插入的值。
修改
好的,所以你想要这样的东西:
for (name, price) in zip(productname, productprice):
name_data = name.renderContents()
price_data = price.renderContents().replace() # fill in your replacements here
site_data = sitename.renderContents()
assign_number = random.randint(1,30)
c.execute('insert into table1 values (?,?,?,?)',
(name_data, price_data, site_data, assign_name))