title: Scrapy: TypeError: string indices must be integers, not str?
body: <p>I wrote a spider  which scrape data from a news website:</p>
  
  <pre><code># -*- coding: utf-8 -*-
  import scrapy
  from scrapy.linkextractors import LinkExtractor
  from scrapy.spiders import CrawlSpider, Rule
  
  from items import CravlingItem
  
  import re
  
  
  class CountrySpider(CrawlSpider):
      name = 'Post_and_Parcel_Human_Resource'
  
      allowed_domains = ['postandparcel.info']
      start_urls = ['http://postandparcel.info/category/news/human-resources/']
  
      rules = (
          Rule(LinkExtractor(allow='',
                             restrict_xpaths=(
                                 '//*[@id="page"]/div[4]/div[1]/div[1]/div[1]/h1/a',
                                 '//*[@id="page"]/div[4]/div[1]/div[1]/div[2]/h1/a',
                                 '//*[@id="page"]/div[4]/div[1]/div[1]/div[3]/h1/a'
                             )),
               callback='parse_item',
               follow=False),
      )
  
      def parse_item(self, response):
          i = CravlingItem()
          i['title'] = " ".join(response.xpath('//div[@class="cd_left_big"]/div/h1/text()')
                                .extract()).strip() or " "
          i['headline'] = self.clear_html(
              " ".join(response.xpath('//div[@class="cd_left_big"]/div//div/div[1]/p')
                                   .extract()).strip()) or " "
          i['text'] = self.clear_html(
              " ".join(response.xpath('//div[@class="cd_left_big"]/div//div/p').extract()).strip()) or " "
          i['url'] = response.url
          i['image'] = (" ".join(response.xpath('//*[@id="middle_column_container"]/div[2]/div/img/@src')
                                .extract()).strip()).replace('wp-content/', 'http://postandparcel.info/wp-content/') or " "
          i['author'] = " "
          # print("\n")
          # print(i)
          return i
  
      @staticmethod
      def clear_html(html):
          text = re.sub(r'&lt;(style).*?&lt;/\1&gt;(?s)|&lt;[^&gt;]*?&gt;|\n|\t|\r', '', html)
          return text
  </code></pre>
  
  <p>and i also wrote a piece of code in the pipeline to refine the extracted texts:
  and here is the pipeline:</p>
  
  <pre><code>from scrapy.conf import settings
  from scrapy import log
  import pymongo
  import json
  import codecs
  import re
  class RefineDataPipeline(object):
      def process_item(self, item, spider):
          #In this section: the below edits will be applied to all scrapy crawlers.
      item['text'] =str( item['text'].encode("utf-8"))
      replacements ={"U.S.":" US ", " M ":"Million", "same as the title":"", " MMH Editorial ":"", " UPS ":"United Parcel Service", " UK ":" United Kingdom "," Penn ":" Pennsylvania ", " CIPS ":" Chartered Institute of Procurement and Supply ", " t ":" tonnes ", " Uti ":" UTI ", "EMEA":" Europe, Middle East and Africa ", " APEC ":" Asia-Pacific Economic Cooperation ", " m ":" million ", " Q4 ":" 4th quarter ", "LLC":"", "Ltd":"", "Inc":"", "Published text":" Original text "}
  
  
      allparen= re.findall('\(.+?\)',item['text'])
      for item in allparen:
          if item[1].isupper() and item[2].isupper():
              replacements[str(item)]=''
          elif item[1].islower() or item[2].islower():
              replacements[str(item)]=item[1:len(item)-1]
          else:
              try:
                  val = int(item[1:len(item)-1])
                  replacements[str(item)]= str(val)
              except ValueError:
                  pass
      def multireplace(s, replacements):
          substrs = sorted(replacements, key=len, reverse=True)
          regexp = re.compile('|'.join(map(re.escape, substrs)))
              return regexp.sub(lambda match: replacements[match.group(0)],s)
      item['text'] = multireplace(item['text'], replacements)
      item['text'] = re.sub( '\s+', ' ', item['text'] ).strip()
      return item
  </code></pre>
  
  <p>but there is a huge problem which prevent the spider from scraping the data successfully: </p>
  
  <blockquote>
    <p>Traceback (most recent call last):   File
    "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line
    588, in _runCallbacks
        current.result = callback(current.result, *args, **kw)   File "/home/hathout/Desktop/updataed portcalls/thomas/thomas/pipelines.py",
    line 41, in process_item
        item['text'] = multireplace(item['text'], replacements) TypeError: string indices must be integers, not str</p>
  </blockquote>
  
  <p>I really do not know how to overcome the "TypeError: string indices must be integers, not str" error. </p>