0

如何连接第 27 行?我收到“TypeError:无法连接 'str' 和 'list' 对象。” 是因为我在符号列表中使用了一个不断变化的变量吗?

这是我正在谈论的行:

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

下面是我的代码和第 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)
4

1 回答 1

4

re.findall() always returns a list; perhaps you wanted to turn that into a string:

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

Alternatively, print only the first element:

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

Parsing HTML is easier with an HTML parser; BeautifulSoup would be a better tool:

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

A quick demo:

>>> 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
于 2013-10-05T23:51:53.290 回答