这是我试图实现的函数:
#Accessing webpage containing list
def save_r1000_tickers():
resp = requests.get('https://en.wikipedia.org/wiki/Russell_1000_Index')
soup = bs.BeautifulSoup(resp.text, features="lxml")
table = soup.find('table', {'class' : 'wikitable sortable'})
tickers = []
#look at all table rows starting with 2nd row (1st = table header)
for row in table.findAll('tr')[1:]:
#extract 2nd column
ticker = row.findAll('td')[1].text
tickers.append(ticker)
with open("r1000.pickle", "wb") as f:
pickle.dump(tickers,f)
print(tickers)
return tickers
save_r1000_tickers()
出于某种原因,这将以以下格式返回文本:'GNTX\n'、'GPC\n'、'GILD\n'、
我尝试过不同的策略来消除它,但还没有成功地消除它。这似乎应该很简单,但由于某种原因,我无法解决它。
例如,我发现了一个教程,他们在其中使用了类似的网络抓取策略:
for cell in tr:
th = cell.find_all('th')
th_data = [col.text.strip('n') for col in th]
td = cell.find_all('td')
row = [i.text.replace('n','') for i in td]
writer.writerow(th_data+row)
然而,当我尝试以以下方式添加时:
td = row.findAll('td')[1].text
ticker = [i.text.replace('n','') for i in td]
tickers.append(ticker)
我得到错误";AttributeError:"str"对象没有属性"text"。我真的不明白幕后发生了什么,也就是说,为什么股票代码(我认为是一个字符串(没有属性文本。。。很明显,我是蟒蛇的新手。
如有任何帮助,我们将不胜感激,提前感谢。
通过在row.findAll('td')
之后包含[1].text
,可以检索findAll
返回的列表中第一个项目的文本。卸下它应该可以工作。此外,replace('n','')
可以替换为strip()
:
td = row.findAll('td')
ticker = [i.text.strip() for i in td]
tickers.append(ticker)