当前位置: 首页 > 知识库问答 >
问题:

scrapy csv文件有统一的空行?

吴浩皛
2023-03-14

这里是蜘蛛:

import scrapy
from danmurphys.items import DanmurphysItem

class MySpider(scrapy.Spider):
    name = 'danmurphys'
    allowed_domains = ['danmurphys.com.au']
    start_urls = ['https://www.danmurphys.com.au/dm/navigation/navigation_results_gallery.jsp?params=fh_location%3D%2F%2Fcatalog01%2Fen_AU%2Fcategories%3C%7Bcatalog01_2534374302084767_2534374302027742%7D%26fh_view_size%3D120%26fh_sort%3D-sales_value_30_days%26fh_modification%3D&resetnav=false&storeExclusivePage=false']


    def parse(self, response):        
        urls = response.xpath('//h2/a/@href').extract()
        for url in urls:            
            request = scrapy.Request(url , callback=self.parse_page)      
            yield request

    def parse_page(self , response):
        item = DanmurphysItem()
        item['brand'] = response.xpath('//span[@itemprop="brand"]/text()').extract_first().strip()
        item['name'] = response.xpath('//span[@itemprop="name"]/text()').extract_first().strip()
        item['url'] = response.url     
        return item

以下是项目:

import scrapy
class DanmurphysItem(scrapy.Item):  
    brand = scrapy.Field()
    name = scrapy.Field()
    url = scrapy.Field()

使用以下命令运行spider时:

scrapy crawl danmurphys -o output.csv

共有3个答案

郑理
2023-03-14

我通过以下步骤设法解决此问题:

C:.
|   scrapy.cfg
|
\---my_scraper
    |   exporters.py
    |   items.py
    |   middlewares.py
    |   pipelines.py
    |   settings.py
    |   __init__.py
    |
    +---spiders
    |   |   my_spider.py
    |   |   __init__.py
    |
# -*- coding: utf-8 -*-
import csv
import io
import os
import six

from scrapy.conf import settings
from scrapy.exporters 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 MyCsvItemExporter(CsvItemExporter):

    def __init__(self, file, include_headers_line=True, join_multivalued=',', **kwargs):

        # Custom delimiter
        delimiter = settings.get('CSV_DELIMITER', ';')
        kwargs['delimiter'] = delimiter

        super(MyCsvItemExporter, 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)
# ...

FEED_EXPORT_ENCODING = 'utf-8'

FEED_EXPORTERS = {
    'csv': 'my_scraper.exporters.MyCsvItemExporter',
}

CSV_DELIMITER = ';'

我希望这对你有帮助

柳高卓
2023-03-14

此输出显示了在windows上使用“w”模式打开csv文件句柄的典型症状(可能是为了修复Python 3的兼容性),但忽略了换行符。

虽然这对基于Linux/Unix的系统没有影响,但在Windows上,会发出2个回车符,在每个数据行后面插入一个伪空行。

with open("output.csv","w") as f:
     cr = csv.writer(f)

正确的操作方法(python 3):

with open("output.csv","w",newline='') as f:  # python 3
     cr = csv.writer(f)

(在Python2中,将“wb”设置为开放模式可以修复它)

如果文件是由无法或不想修改的程序创建的,则始终可以按如下方式对文件进行后期处理:

with open("output.csv","rb") as f:
   with open("output_fix.csv","w") as f2:
       f2.write(f.read().decode().replace("\r","")) # python 3
       f2.write(f.read().replace("\r","")) # python 2

邢英奕
2023-03-14

要在Scrapy 1.3中解决这个问题,您可以通过将newline="作为参数添加io来修补它。TextIOWrapper中的__init__方法的CsvItemExporter类在scrapy.exporters中。

 类似资料:
  • 以下是我在form1构造函数中使用文本文件的方式: 创建空文本文件: 这是文本文件test.txt在所有提取之后的最终结果: 文本文件 你可以看到第一行是空行,然后最大的文本行不是从左边开始的,而是从左边开始的,但是有一个空格。然后在每两行之间有一个空格/空行。

  • 在HDFS的上下文中,我们有Namenode和Datanode,说Namenode存储了文件系统名称空间是什么意思? 还有,我们为datanode指定的目录(在hdfs-core.xml中)是唯一可以存储数据的地方,还是我们可以指定任何其他目录来保存数据?

  • 问题内容: 我一直在阅读和谷歌搜索,但似乎找不到这个简单的答案。 我有一个读取文件的功能,但是如果文件不存在,则会出现混乱。我想做的是一个函数,该函数在读取之前会检查文件是否存在,如果不存在,则会创建一个空文件。这就是我所拥有的。 问题答案: 不要尝试先检查是否存在,因为如果同时创建了文件,那么您将面临一场竞赛。您可以打开带有标志的文件以创建该文件(如果不存在):

  • Ceph v0.55 及后续版本默认开启了 cephx 认证。从用户空间( FUSE )挂载一 Ceph 文件系统前,确保客户端主机有一份 Ceph 配置副本、和具备 Ceph 元数据服务器能力的密钥环。 在客户端主机上,把监视器主机上的 Ceph 配置文件拷贝到 /etc/ceph/ 目录下。 sudo mkdir -p /etc/ceph sudo scp {user}@{server-mac

  • 我创建了一个docker容器,然后我创建了一个文件并退出该容器。 当我重新启动容器时: 如何再次启动同一容器并将文件放入其中? 如何导出带有文件更改的容器?

  • 问题内容: 我正在尝试编写脚本,将大照片裁剪并调整为高清壁纸。 但是该脚本似乎在文件名中带有空格的问题(例如Tumble Weed.jpg)。我怎样才能解决这个问题? 问题答案: 首先,您不需要。通过在backtics中使用,您可以使bash隐式地将字符串解析为一个列表,该列表按空格分隔。而是让bash生成列表并将其分离,而无需进行此类怪癖: 另外,您需要将所有用法都括在引号中,以使bash整体上