Python Проблема с извлечением даты Scrapy - PullRequest
0 голосов
/ 05 августа 2020

Я борюсь с тем, как правильно извлечь дату в странном формате, которая существует на странице в одном месте, используя Python Scrapy.

Что нужно изменить, чтобы дата включалась в каждый строка вывода в формате гггг-мм-дд?

Проблемные c строки кода:

data2 = response.xpath('//span[@class="tab"]/text()').get().replace(". ", "-")
date = datetime.datetime.strptime(data2, "%d-%m-%Y").strftime("%Y-%m-%d")

Образец выходных данных содержит один символ для даты. Пример: {'match_id': '1893065', 'date': '0'}

Вот полный паук.

import scrapy import datetime Импорт из даты и времени Импорт времени delta

class Tennis_ExplorerSpider(scrapy.Spider):
    name = 'tennis_explorer'
    allowed_domains = ['tennisexplorer.com']

    def daterange(start_date, end_date):
        for n in range(int((end_date - start_date).days)):
            yield start_date + timedelta(n)
    
    start_date = datetime.datetime.today() - datetime.timedelta(days=1)
    end_date = datetime.datetime.today() + datetime.timedelta(days=1)    
    start_urls = []
    start_url='https://www.tennisexplorer.com/matches/?type=all&year='
    for single_date in daterange(start_date, end_date):
        start_urls.append(single_date.strftime(start_url+"%Y&month=%m&day=%d&timezone=-6"))

    
    def parse(self, response): 
            #Extracting the content using xpath            
            self.logger.debug('callback "parse": got response %r' % response)
            data = response.xpath('//table[@class="result"]//a[contains(@href,"match-detail")]/@href').extract()
            match_id =[re.sub('^.+=','',el) for el in data]

            data2 = response.xpath('//span[@class="tab"]/text()').get().replace(". ", "-")
            date = datetime.datetime.strptime(data2, "%d-%m-%Y").strftime("%Y-%m-%d")
            
            #Give the extracted content row wise
            for item in zip(match_id, date):
                #create a dictionary to store the scraped info
                scraped_info = {
                    'match_id' : item[0],
                    'date' : item[1]
                }

                #yield or give the scraped info to scrapy
                yield scraped_info
        

1 Ответ

1 голос
/ 05 августа 2020

Кажется, у вас есть бесполезный datetime в вашем скрипте (datetime.datetime.strptime). Вы также можете изменить формат даты с помощью регулярного выражения. С re.sub:

data = "01. 01. 2008"
print(re.sub("^(\d+).+?(\d+).+(\d{4})$",'\g<3>-\g<2>-\g<1>',data))

Вывод:

2008-01-01

Что касается вашей проблемы, используйте len(), чтобы создать список такой же длины, как количество совпадений, отображаемых на веб-странице :

date = re.sub("^(\d+).+?(\d+).+(\d{4})$",'\g<3>-\g<2>-\g<1>',data)
nbel = len(response.xpath('//table[@class="result"]//a[contains(@href,"match-detail")]').extract
dates = [date]*nbel

Вывод:

['2008-01-01', '2008-01-01', '2008-01-01',...,'2008-01-01', '2008-01-01', '2008-01-01']

В зависимости от ожидаемого результата вы можете построить свой словарь таким образом (даты - это ваш список со всеми датами, а идентификаторы - это список со всеми ваши идентификаторы имеют одинаковую длину):

dic={}
dic["matches:"]=[]
for el in range(1,len(ids)):
    dic1={"id:":ids[el],"date":dates[el]}
    dic["matches:"].append(dic1)

print(dic)

Вывод:

{'matches:': [{'id:': '1893063', 'date': '2020-08-04'}, {'id:': '1893067', 'date': '2020-08-04'}, {'id:': '1893062', 'date': '2020-08-04'}, {'id:': '1893059', 'date': '2020-08-04'}, {'id:': '1893061', 'date': '2020-08-04'}, {'id:': '1893066', 'date': '2020-08-04'}, {'id:': '1893229', 'date': '2020-08-04'}, {'id:': '1893065', 'date': '2020-08-04'}, {'id:': '1893117', 'date': '2020-08-04'}, {'id:': '1893134', 'date': '2020-08-04'}, {'id:': '1893133', 'date': '2020-08-04'}, {'id:': '1893130', 'date': '2020-08-04'}, {'id:': '1893158', 'date': '2020-08-04'}, {'id:': '1893048', 'date': '2020-08-04'}, {'id:': '1893047', 'date': '2020-08-04'}, {'id:': '1893045', 'date': '2020-08-04'}, {'id:': '1893046', 'date': '2020-08-04'}, {'id:': '1893109', 'date': '2020-08-04'}, {'id:': '1893110', 'date': '2020-08-04'}, {'id:': '1893107', 'date': '2020-08-04'}, {'id:': '1893108', 'date': '2020-08-04'}, {'id:': '1893105', 'date': '2020-08-04'}, {'id:': '1893106', 'date': '2020-08-04'}, {'id:': '1893058', 'date': '2020-08-04'}, {'id:': '1893057', 'date': '2020-08-04'}, {'id:': '1893056', 'date': '2020-08-04'}, {'id:': '1893055', 'date': '2020-08-04'}, {'id:': '1893054', 'date': '2020-08-04'}, {'id:': '1893053', 'date': '2020-08-04'}, {'id:': '1893139', 'date': '2020-08-04'}, {'id:': '1893131', 'date': '2020-08-04'}, {'id:': '1893102', 'date': '2020-08-04'}, {'id:': '1893116', 'date': '2020-08-04'}, {'id:': '1893115', 'date': '2020-08-04'}, {'id:': '1893114', 'date': '2020-08-04'}, {'id:': '1893113', 'date': '2020-08-04'}]}

Визуальный вывод:

Di c

...