Я хочу удалить скобки, добавленные скобками [] ко всем выводам, для этого просто добавьте [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