2013-11-19 4 views
0

У меня есть scrapy pulling данные с веб-страницы. Проблема, с которой я столкнулся, - это тянуть много пробелов, и я решил использовать .strip(), как это было предложено другими. Ive столкнуться с проблемой, хотяPython .strip() не сохраняет за пределами оператора if?

if a.strip(): 
    print a 
if b.strip(): 
    print b 

Returns:

a1 
b1 
. 
. 
. 

Но это:

if a.strip(): 
    aList.append(a) 
if b.strip(): 
    bList.append(b) 
print aList, bList 

возвращает это:

a1 



    b1 

Im пытается имитировать пробельные, что я удалите с .strip() здесь, но вы получите t он указывает. По какой-то причине он добавляет пробелы в список, хотя я сказал это не делать. Я даже могу распечатать список в инструкции if, и он также отображается правильно, но по какой-то причине, когда я решаю распечатать за пределами операторов if, он не работает так, как я предполагал.

Вот весь мой код:

# coding: utf-8 
from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from scrapy.contrib.exporter import CsvItemExporter 
import re 
import csv 
import urlparse 
from stockscrape.items import EPSItem 
from itertools import izip 

class epsScrape(BaseSpider): 
     name = "eps" 
     allowed_domains = ["investors.com"] 
     ifile = open('test.txt', "r") 
     reader = csv.reader(ifile) 
     start_urls = [] 
     for row in ifile: 
       url = row.replace("\n","") 
       if url == "symbol": 
         continue 
       else: 
         start_urls.append("http://research.investors.com/quotes/nyse-" + url + ".htm") 
     ifile.close() 

     def parse(self, response): 
       f = open("eps.txt", "a+") 
       sel = HtmlXPathSelector(response) 
       sites = sel.select("//div") 
#    items = [] 
       for site in sites: 
         symbolList = [] 
         epsList = [] 
         item = EPSItem() 
         item['symbol'] = site.select("h2/span[contains(@id, 'qteSymb')]/text()").extract() 
         item['eps'] = site.select("table/tbody/tr/td[contains(@class, 'rating')]/span/text()").extract() 
         strSymb = str(item['symbol']) 
         newSymb = strSymb.replace("[]","").replace("[u'","").replace("']","") 
         strEps = str(item['eps']) 
         newEps = strEps.replace("[]","").replace(" ","").replace("[u'\\r\\n","").replace("']","") 
         if newSymb.strip(): 
           symbolList.append(newSymb) 
#        print symbolList 
         if newEps.strip(): 
           epsList.append(newEps) 
#        print epsList 
         print symbolList, epsList 
       for symb, eps in izip(symbolList, epsList): 
         f.write("%s\t%s\n", (symb, eps)) 
       f.close() 
+1

Вы должны делать 'bList.append (b.strip())' – karthikr

+2

Что делает * документация * say ['strip'] (http://docs.python.org/2/library/string.html) делает? – user2864740

+4

Строки неизменяемы; '.strip()' не может изменить значение, поэтому он возвращает * новый * удаленный строковый объект. –

ответ

8

strip не изменяет строку на месте. Он возвращает новую строку с разделенным пробелом.

>>> a = ' foo  ' 
>>> b = a.strip() 
>>> a 
' foo  ' 
>>> b 
'foo' 
+0

Я считаю, что я пытался что-то подобное, где я сделал это: если a.strip(): Ь = а если c.strip(): d = с Но когда я попытался напечатать это вне если оно напечатано со всеми пробелами. – Resin

+0

В качестве побочной заметки Python имеет несколько встроенных типов (числа, булевы, строки, кортежи, фризонсет), которые неизменяемы. – crownedzero

+1

@Resin Как я уже сказал, 'a.strip()' возвращает новую строку - 'a' не изменяется. Поэтому, когда вы пишете 'if a.strip(): b = a', он установит' b' в исходную (unstripped) переменную 'a'. – bogatron

0

Я понял, что это за то, что вызывает путаницу. Его местоположение, которое я объявил переменной/list. Я объявлял его внутри цикла for, поэтому каждый раз, когда он повторял его, он переписывался, а пустой список или переменная был одним и тем же результатом false для моего оператора if.