У меня есть простой паук, который просматривает местные некрологи. Код работает отлично, пока я не попытаюсь добавить два статических столбца. Все, что я хочу сделать, это добавить дату, когда я извлек информацию (элемент извлечения), и состояние, в котором она была извлечена (элемент состояния). Это самозагружающаяся страница, поэтому, когда я добавляю дату извлечения, я получаю только первые 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






Объясняю почему:
если вставить сюда 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.