【问题标题】:Python & Excel ConcatenatePython 和 Excel 连接
【发布时间】:2013-10-12 18:57:47
【问题描述】:

如何连接第 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)

【问题讨论】:

  • re.findall() 返回一个列表。它抱怨的是price,而不是symbolslist

标签: python excel concatenation


【解决方案1】:

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

【讨论】:

  • 如何将 re.findall() 改成字符串?
  • @RobB.:通过获取第一个元素或将所有元素连接成一个字符串。我已经为您提供了这两种选择的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 2014-05-02
  • 1970-01-01
相关资源
最近更新 更多