Печать данных скрапа в CSV - PullRequest
       8

Печать данных скрапа в CSV

0 голосов
/ 29 октября 2018

Привет, я недавно начал scrapy и написал гусеничный ход. Но при выводе данных в csv все они печатаются в одну строку. Как распечатать все данные в отдельной строке?

В моем случае я печатаю ссылки с веб-сайта. Хорошо работает при печати в формате json.

Вот код.

Файл items.py.

import scrapy
from scrapy.item import Item ,Field
class ErcessassignmentItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
link = Field()
#pass

mycrawler.py

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector # deprecated
from scrapy.selector import Selector
from ercessAssignment.items import ErcessassignmentItem

class MySpider(BaseSpider):
name ="ercessSpider"
allowed_domains =["site_url"]
start_urls = ["site_url"]

def parse(self, response):
    hxs = Selector(response)
    links = hxs.xpath("//p")
    items = []
    for linkk in links:
        item = ErcessassignmentItem()
        item["link"] = linkk.xpath("//a/@href").extract()
        items.append(item)
        return items`

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы должны иметь правильный отступ в коде

import scrapy
from scrapy.item import Item ,Field
class ErcessassignmentItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    link = Field()

Тогда в вашем пауке не используйте return, ваш цикл for будет выполняться только один раз, и в CSV будет напечатана только 1 строка, вместо этого используйте yield Во-вторых, где ваш код для размещения элементов в CSV? Я полагаю, вы используете скрап-способ хранения предметов по умолчанию, если вы уже не знаете, запустите ваш скребок, как

scrapy crawl ercessSpider -o my_output.csv

Ваш код паука должен быть таким, обратите внимание на изменения, которые я сделал

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector # deprecated
from scrapy.selector import Selector
from ercessAssignment.items import ErcessassignmentItem

class MySpider(BaseSpider):
name ="ercessSpider"
allowed_domains =["site_url"]
start_urls = ["site_url"]

def parse(self, response):
    hxs = Selector(response)
    links = hxs.xpath("//p")
    for linkk in links:
        item = ErcessassignmentItem()
        item["link"] = linkk.xpath("//a/@href").extract()
        yield item
0 голосов
/ 29 октября 2018

Ваш код выше не print ничего. Более того, я не вижу никакой .csv части. Кроме того, ваш items список, созданный в parse(), никогда не будет длиннее 1 из-за чего-то, что для меня похоже на ошибку отступа (т. Е. Вы return после первой итерации for-loop. Для лучшей читаемости вы здесь можно использовать for / else :

def parse(self, response):
    hxs = Selector(response)
    links = hxs.xpath("//p")
    items = []
    for linkk in links:
        item = ErcessassignmentItem()
        item["link"] = linkk.xpath("//a/@href").extract()
        items.append(item)
    else:                               # after for loop is finished
        # either return items
        # or print link in items here without returning
        for link in items:              # take one link after another
            print link                  # and print it in one line each
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...