2013-10-05 35 views
0

如何連接27行?我得到「TypeError:無法連接'str'和'list'對象。」是否因爲我在符號列表中使用了變量變量?Python&Excel連接

這是我講的線:

ws.cell(1,i+1).value = "The price of" + symbolslist[i] + " is " + price 

下面是我的代碼和行rewst 27

from openpyxl import Workbook 

import urllib 
import re 

from openpyxl.cell import get_column_letter 

wb = Workbook() 

dest_filename = r'empty_book.xlsx' 

ws = wb.create_sheet() 

ws.title = 'Stocks' 
symbolslist = ["aapl","spy","goog","nflx"] 

i=0 
while i<len(symbolslist): 
    #counts each object as 1 in the list 
    url = "http://finance.yahoo.com/q?s="+symbolslist[i]+"&q1=1" 
    htmlfile = urllib.urlopen(url) 
    htmltext = htmlfile.read() 
    regex = '<span id="yfs_l84_'+symbolslist[i]+'">(.+?)</span>' 
    pattern = re.compile(regex) 
    price = re.findall(pattern,htmltext) 
    print "The price of", symbolslist[i], " is ", price 
    ws.cell(1,i+1).value = "The price of" + symbolslist[i] + " is " + price 
    i+=1 


wb.save(filename = dest_filename) 
+0

're.findall()'返回一個列表。它抱怨'價格',而不是'symbolslist'。 –

回答

4

re.findall()總是返回一個列表;也許你想要把它轉換成字符串:

ws.cell(1,i+1).value = "The price of" + symbolslist[i] + " is " + ','.join(price) 

或者,只打印第一個元素:

ws.cell(1,i+1).value = "The price of" + symbolslist[i] + " is " + price[0] 

解析HTML是一種HTML解析器容易; BeautifulSoup將是一個更好的工具:

import urllib 
from bs4 import BeautifulSoup 

for symbol in symbolslist: 
    url = "http://finance.yahoo.com/q?s={}&q1=1".format(symbol) 
    response = urllib.urlopen(url) 
    soup = BeautifulSoup(response, from_encoding=response.headers.getparam('charset')) 
    price = soup.find('span', id='yfs_l84_' + symbol).text 
    text = "The price of {} is {}".format(symbol, price) 
    print text 
    ws.cell(1,i+1).value = text 

一個快速演示:

>>> import urllib2 
>>> from bs4 import BeautifulSoup 
>>> symbolslist = ["aapl","spy","goog","nflx"] 
>>> for symbol in symbolslist: 
...  url = "http://finance.yahoo.com/q?s={}&q1=1".format(symbol) 
...  response = urllib.urlopen(url) 
...  soup = BeautifulSoup(response, from_encoding=response.headers.getparam('charset')) 
...  price = soup.find('span', id='yfs_l84_' + symbol).text 
...  text = "The price of {} is {}".format(symbol, price) 
...  print text 
... 
The price of aapl is 483.03 
The price of spy is 168.89 
The price of goog is 872.35 
The price of nflx is 327.26 
+0

如何將re.findall()更改爲字符串? –

+0

@RobB .:通過獲取第一個元素或將所有元素連接到一個字符串中。我給了你兩個選項的例子。 –

+0

很酷,感謝您的信息。 –