2017-08-27 31 views
-1

私はpython scrapyで非常に小さなスクリプトを書いて、yellowpageウェブサイトの複数のページに表示された名前、住所、電話番号を解析しました。スクリプトを実行すると、スムーズに動作することがわかります。しかし、私が遭遇する唯一の問題は、データがCSV出力で掻き取られる方法です。これは常に2つの行の間の行(行)の隙間です。私が意味していたことは、データは他のすべての行に印刷されているということです。下の画像を見ると、私が何を意味しているか知ることができます。もし治療のためでないなら、私は[newline = '']を使うことができました。しかし、残念ながら私はここで全く無力です。 csvの出力に空白行が含まれているのをどのように取り除くことができますか?それを調べるために事前に感謝します。csv出力で空白行を取り除くことができません

items.pyが含まれています。ここ

import scrapy 

class YellowpageItem(scrapy.Item): 
    name = scrapy.Field() 
    street = scrapy.Field() 
    phone = scrapy.Field() 

はクモです:

ところで

enter image description here

、コマンド:ここ

import scrapy 

class YellowpageSpider(scrapy.Spider): 
    name = "YellowpageSp" 
    start_urls = ["https://www.yellowpages.com/search?search_terms=Pizza&geo_location_terms=Los%20Angeles%2C%20CA&page={0}".format(page) for page in range(2,6)] 

    def parse(self, response): 
     for titles in response.css('div.info'): 
      name = titles.css('a.business-name span[itemprop=name]::text').extract_first() 
      street = titles.css('span.street-address::text').extract_first() 
      phone = titles.css('div[itemprop=telephone]::text').extract_first() 
      yield {'name': name, 'street': street, 'phone':phone} 

は、CSV出力がどのように見えるかです私はCSV出力を取得するために使用しています:

scrapy crawl YellowpageSp -o items.csv -t csv 
+0

私はすぐに話しました。これは私のために働いた。私はこの答えと質問を投票しています:D –

答えて

3

新しいFeedExporterを作成することで修正できます。 exporters.py

プロジェクト内exporters.py

import io 
import os 
import six 
import csv 

from scrapy.contrib.exporter import CsvItemExporter 
from scrapy.extensions.feedexport import IFeedStorage 
from w3lib.url import file_uri_to_path 
from zope.interface import implementer 


@implementer(IFeedStorage) 
class FixedFileFeedStorage(object): 

    def __init__(self, uri): 
     self.path = file_uri_to_path(uri) 

    def open(self, spider): 
     dirname = os.path.dirname(self.path) 
     if dirname and not os.path.exists(dirname): 
      os.makedirs(dirname) 
     return open(self.path, 'ab') 

    def store(self, file): 
     file.close() 


class FixLineCsvItemExporter(CsvItemExporter): 

    def __init__(self, file, include_headers_line=True, join_multivalued=',', **kwargs): 
     super(FixLineCsvItemExporter, self).__init__(file, include_headers_line, join_multivalued, **kwargs) 
     self._configure(kwargs, dont_fail=True) 
     self.stream.close() 
     storage = FixedFileFeedStorage(file.name) 
     file = storage.open(file.name) 
     self.stream = io.TextIOWrapper(
      file, 
      line_buffering=False, 
      write_through=True, 
      encoding=self.encoding, 
      newline="", 
     ) if six.PY3 else file 
     self.csv_writer = csv.writer(self.stream, **kwargs) 

を作成し、あなたのsettings.py

FEED_EXPORTERS = { 
    'csv': 'project.exporters.FixLineCsvItemExporter', 
} 

以下のように変更し、私は、Mac上でだので、そのウィンドウの動作をテストすることはできません。しかし、上記がうまくいかない場合は、コードの一部を変更して設定してください。 newline="\n"

 self.stream = io.TextIOWrapper(
      file, 
      line_buffering=False, 
      write_through=True, 
      encoding=self.encoding, 
      newline="\n", 
     ) if six.PY3 else file 
+0

ありがとうTarun。あなたは本当にパイソンの巨人です。私はこの問題に長年苦しんできました。ソリューションを探すためにいくつかのスレッドを作成して削除しました。あなたはすべてを解決しました。私はアップボットのボタンを何百回も押すことができたらいいと思う。 Btw、私は他のプロジェクトでもこれを使うことができますか?これは、これがとても巨大で、ペースを維持する以外に自分自身を作り出すのが難しいからです。大変ありがとうございました。 – SIM

+0

どこでも使えます –

+0

私はあまりにも貪欲でないかどうかを知る最後のことは一つです。列の位置が変更されることがあります。しかし、それは大きな問題ではありませんが、私は知りたいと思っています。リンクが表示されているかどうかを理解できます。最も重要なのは、このスレッドに関連していないので、無視してください。 https://www.dropbox.com/s/tzztbli7v6quhc2/column%20order.txt?dl=0 – SIM

関連する問題