Создайте элемент статического столбца

У меня есть простой паук, который просматривает местные некрологи. Код работает отлично, пока я не попытаюсь добавить два статических столбца. Все, что я хочу сделать, это добавить дату, когда я извлек информацию (элемент извлечения), и состояние, в котором она была извлечена (элемент состояния). Это самозагружающаяся страница, поэтому, когда я добавляю дату извлечения, я получаю только первые 10 результатов (или только первую страницу). Если я добавлю только состояние, я получу только два результата. Когда я удаляю оба, я получаю все 40+ результатов.

Я сделал # строки, которые не работают должным образом:

Файл Item.py:

import scrapy


class AlItem(scrapy.Item):
    name = scrapy.Field()
    link = scrapy.Field()
    obit = scrapy.Field()
    news = scrapy.Field()
    #pull = scrapy.Field()
    #state = scrapy.Field()

файл паука:

import scrapy
import time
from al.items import AlItem

class AlabamaSpider(scrapy.Spider):
    name = 'alabama'
    allowed_domains = ['legacy.com']
    start_urls = ['http://www.legacy.com/obituaries/annistonstar/browse?type=paid&page=20']

    def parse(self, response):
    name = response.xpath('//a[@class = "NonMobile"]/p[@class = "obitName"]/text()').extract()
    link = response.xpath('//div[@class = "RightColumn"]//a[@class = "ObituaryButton"]/@href').extract()
    obit = response.xpath('//div[@class = "NameAndLocation"]/p[@class = "obitText"]/text()').extract()
    news = response.xpath('//div[@class = "PublishedLine publishedLine"]/span/text()').extract()
    #pull = time.strftime("%m/%d/%Y")
    #state = "AL"

    for item in zip(name, link, obit, news): #removed 'pull, state'

        new_item = AlItem()

        new_item['name'] = item[0]
        new_item['link'] = item[1]
        new_item['obit'] = item[2]
        new_item['news'] = item[3]
        #new_item['pull'] = pull
        #new_item["state"] = state

        yield new_item
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объясняю почему:

  1. если вставить сюда for item in zip(name, link, obit, news): pull&state, то получится количество итераций равное 2, т.к. state = "AL" - строковая переменная. Функция ZIP получает от state два символа и устанавливает итерацию = 2 для всех аргументов в цикле. zip получает наименьшее количество аргументов для итерации. как с даты 01.01.2001 - 10 знаков. (будут ли итерации равны 10)

БУДЕТ РАБОТАТЬ:

`class AlItem(scrapy.Item):
  name = scrapy.Field()
  link = scrapy.Field()
  obit = scrapy.Field()
  news = scrapy.Field()
  pull = scrapy.Field()
  state = scrapy.Field()`

class AlabamaSpider(scrapy.Spider): name = 'alabama' allowed_domains = ['legacy.com'] start_urls = ['http://www.legacy.com/obituaries/annistonstar/browsetype=paid&page=20']

    def parse(self, response):
        name = response.xpath('//a[@class = "NonMobile"]/p[@class = "obitName"]/text()').extract()
        link = response.xpath('//div[@class = "RightColumn"]//a[@class = "ObituaryButton"]/@href').extract()
        obit = response.xpath('//div[@class = "NameAndLocation"]/p[@class = "obitText"]/text()').extract()
        news = response.xpath('//div[@class = "PublishedLine publishedLine"]/span/text()').extract()
        pull = time.strftime("%m/%d/%Y")
        state = "AL"

        for item in zip(name, link, obit, news): #removed 'pull, state'

            new_item = AlItem()

            new_item['name'] = item[0]
            new_item['link'] = item[1]
            new_item['obit'] = item[2]
            new_item['news'] = item[3]
            new_item['pull'] = pull
            new_item["state"] = state

            yield new_item

Спасибо за объяснение. Я искал в Интернете решение и нашел функцию: zip_longest. Я изменил zip на zip_longest. из itertools импортируйте zip_longest.

Ryan Evans 31.01.2019 13:22

Да, этот вариант тоже подойдет. Удачи в программировании!!)

Иван Васильев 31.01.2019 15:29

Другие вопросы по теме