2013-11-18 4 views
0

Я использую следующий код для удаления данных из Yahoo! Финансы, однако, изменение, которое я сделал для первого оператора исключения, вызывает цикл цикла ... ничего не записывается в CSV-файл вообще. В настоящее время я работаю через отладчик для этой ошибки. Ошибки, которые, как мне кажется, вызываются в цикле while.Формат вложенной петли Python

import urllib2 
from BeautifulSoup import BeautifulSoup 
import csv 
import re 
import urllib 
from urllib2 import HTTPError 
# import modules 

symbolfile = open("symbols.txt") 
symbolslist = symbolfile.read() 
newsymbolslist = symbolslist.split("\n") 

i = 0 

f = csv.writer(open("pe_ratio.csv","wb")) 
# short cut to write 

f.writerow(["Name","PE","Revenue % Quarterly","ROA% YOY","Operating Cashflow","Debt to Equity"]) 
#first write row statement 

# define name_company as the following 
while i<len(newsymbolslist): 
    try: 
     page = urllib2.urlopen("http://finance.yahoo.com/q/ks?s="+newsymbolslist[i] +"%20Key%20Statistics").read() 
    except urllib2.HTTPError: 
     continue 
     soup = BeautifulSoup(page) 
     name_company = soup.findAll("div", {"class" : "title"}) 
     for name in name_company: #add multiple iterations?   
      all_data = soup.findAll('td', "yfnc_tabledata1") 
      stock_name = name.find('h2').string #find company's name in name_company with h2 tag 
      try:  
       f.writerow([stock_name, all_data[2].getText(),all_data[17].getText(),all_data[13].getText(), all_data[29].getText(),all_data[26].getText()]) #write down PE data 
      except (IndexError, HTTPError) as e: 
       pass 
      i+=1  

Спасибо за вашу помощь заранее.

+3

Это ваш фактический отступ? Подсказка: любой код, появляющийся после инструкции 'continue', на том же уровне отступа, никогда не будет выполняться. – Kevin

ответ

1

Попробуйте положить i = i + 1 один отступ раньше, так что он находится за пределами отдельной петли? Я также поместил бы отступ в код после «продолжения» в той же строке, что и try, но кроме этого, иначе он будет работать только в случае исключения (или будет передан полностью из-за продолжения).

while i<len(newsymbolslist): 
    try: 
     page = urllib2.urlopen("http://finance.yahoo.com/q/ks?s="+newsymbolslist[i] +"%20Key%20Statistics").read() 
    except urllib2.HTTPError: 
     continue 
    soup = BeautifulSoup(page) 
    name_company = soup.findAll("div", {"class" : "title"}) 
    for name in name_company: #add multiple iterations?   
     all_data = soup.findAll('td', "yfnc_tabledata1") 
     stock_name = name.find('h2').string #find company's name in name_company with h2 tag 
     try:  
      f.writerow([stock_name, all_data[2].getText(),all_data[17].getText(),all_data[13].getText(), all_data[29].getText(),all_data[26].getText()]) #write down PE data 
     except (IndexError, HTTPError) as e: 
      pass 
    i+=1  
0

Я думаю, что отступ неправильно. Попробуйте следующее:

from BeautifulSoup import BeautifulSoup 
import csv 
import re 
import urllib 
from urllib2 import HTTPError 
# import modules 

symbolfile = open("symbols.txt") 
symbolslist = symbolfile.read() 
newsymbolslist = symbolslist.split("\n") 

i = 0 

f = csv.writer(open("pe_ratio.csv","wb")) 
# short cut to write 

f.writerow(["Name","PE","Revenue % Quarterly","ROA% YOY","Operating Cashflow","Debt to Equity"]) 
#first write row statement 

# define name_company as the following 
while i<len(newsymbolslist): 
    try: 
     page = urllib2.urlopen("http://finance.yahoo.com/q/ks?s="+newsymbolslist[i] +"%20Key%20Statistics").read() 
    except urllib2.HTTPError: 
     continue 
    soup = BeautifulSoup(page) 
    name_company = soup.findAll("div", {"class" : "title"}) 
    for name in name_company: #add multiple iterations?   
     all_data = soup.findAll('td', "yfnc_tabledata1") 
     stock_name = name.find('h2').string #find company's name in name_company with h2 tag 
     try:  
      f.writerow([stock_name, all_data[2].getText(),all_data[17].getText(),all_data[13].getText(), all_data[29].getText(),all_data[26].getText()]) #write down PE data 
     except (IndexError, HTTPError) as e: 
      pass 
    i+=1 
Смежные вопросы