Ответ Scrapy равномерно пустые строки, что делает невозможным форматирование вывода ответа - PullRequest
0 голосов
/ 10 октября 2018

Я хочу удалить скобки, добавленные скобками [] ко всем выводам, для этого просто добавьте [0] в конце оператора xpath следующим образом:

'a[@class="question-hyperlink"]/text()').extract()[0]

, это решает [] проблема в некоторых случаях, но в других случаях scrapy возвращает каждую вторую строку вывода как пустую, и, как таковой, в тот момент, когда она попадает во вторую строку при использовании [0], мне выдается ошибка:

Index error: list index out of range

Как я могу предотвратить создание пустых строк с помощью скрапа?Кажется, что это общая проблема, но все сталкиваются с этой проблемой при экспорте в CSV, в то время как для меня это с ответом scrapy перед экспортом как CSV.

Items.py:

import scrapy
from scrapy.item import Item, Field


class QuestionItem(Item):
    title = Field()
    url = Field()

class PopularityItem(Item):
    votes = Field()
    answers = Field()
    views = Field()


class ModifiedItem(Item):
    lastModified = Field()
    modName = Field()

Паук, который не выводит каждую вторую строку как пустую и, таким образом, работает с [0]:

from scrapy import Spider
from scrapy.selector import Selector

from stack.items import QuestionItem

class QuestionSpider(Spider):
    name = "questions"
    allowed_domains = ["stackoverflow.com"]
    start_urls = [
        "http://stackoverflow.com/questions?pagesize=50&sort=newest",
    ]

    def parse(self, response):
        questions = Selector(response).xpath('//div[@class="summary"]/h3')

        for question in questions:
            item = QuestionItem()
            item['title'] = question.xpath(
                'a[@class="question-hyperlink"]/text()').extract()[0]
            item['url'] = question.xpath(
                'a[@class="question-hyperlink"]/@href').extract()[0]
            yield item

Паук, который дает каждую вторую строку вывода как пустую:

from scrapy import Spider
from scrapy.selector import Selector

from stack.items import PopularityItem


class PopularitySpider(Spider):
    name = "popularity"
    allowed_domains = ["stackoverflow.com"]
    start_urls = [
        "https://stackoverflow.com/",
    ]

    def parse(self, response):
        popularity = response.xpath('//div[contains(@class, "question-summary narrow")]/div')

        for poppart in popularity:

            item = PopularityItem()
            item['votes'] = poppart.xpath(
                'div[contains(@class, "votes")]//span/text()').extract()#[0]
            item['answers'] = poppart.xpath(
                'div[contains(@class, "answered")]//span/text()').extract()#[0]
            item['views'] = poppart.xpath(
                'div[contains(@class, "views")]//span/text()').extract()#[0]
            yield item

Pipelines.py

import pymongo
import logging

class StackPipeline(object):
    def process_item(self, item, spider):
        return item



from scrapy.conf import settings
from scrapy.exceptions import DropItem
from scrapy import log

class MongoDBPipeline(object):


    def __init__(self):

        connection = pymongo.MongoClient(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])
        self.db = connection[settings['MONGODB_DB']]

    def process_item(self, item, spider):
        collection = self.db[type(item).__name__.lower()]
        logging.info(collection.insert(dict(item)))
        return item

1 Ответ

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

Самый простой способ обработать ошибку, подобную этой, - это поймать ее и затем обработать (в данном случае, просто пройдя пустые строки).

class PopularitySpider(Spider):
    name = "popularity"
    allowed_domains = ["stackoverflow.com"]
    start_urls = ["https://stackoverflow.com/"]

    def parse(self, response):
        popularity = response.xpath('//div[contains(@class, "question-summary narrow")]/div')
        for poppart in popularity:
            try:
                item = PopularityItem()
                item['votes'] = poppart.xpath('div[contains(@class, "votes")]//span/text()').extract()[0]
                item['answers'] = poppart.xpath('div[contains(@class, "answered")]//span/text()').extract()[0]
                item['views'] = poppart.xpath('div[contains(@class, "views")]//span/text()').extract()[0]
            except IndexError:
                continue
            yield item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...