Python Индекс сценария-after возвращает только первый результат - PullRequest
0 голосов
/ 03 августа 2020

Я не могу определить, почему мой паук возвращает только первый результат, когда 'match_id' использует нижний индекс после.

Это проблема: c код: match_id = response.xpath ('substring-after (// tr / td [13] / a / @ href, "/match-detail/?id=")').extract()

Мой Паук:

import scrapy
import datetime
from datetime import timedelta

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):
            #self.logger.debug('callback "parse": got response %r' % response)
            #Extracting the content using xpath
            time = response.xpath('//tr/td[1][@class="first time"]/text()').extract()
            match_id = response.xpath('substring-after(//tr/td[13]/a/@href, "/match-detail/?id=")').extract()
            player1 = response.xpath('//tr[not(contains(@class, "head"))]/td[2][@class="t-name"]/a[contains(@href, "/player/")]/text()').extract()
            player2 = response.xpath('//tr[not(contains(@class, "head"))]/td[1][@class="t-name"]/a[contains(@href, "/player/")]/text()').extract()
            player1_sets = response.xpath('//tr/td[3][@class="result"]/text()').extract()
            player2_sets = response.xpath('//tr/td[2][@class="result"]/text()').extract()

            
            #Give the extracted content row wise
            for item in zip(time, match_id, player1, player2, player1_sets, player2_sets):
                #create a dictionary to store the scraped info
                scraped_info = {
                    'time' : item[0],                    
                    'match_id' : item[1],
                    'player1' : item[2],
                    'player2' : item[3],                    
                    'player1_sets' : item[4],
                    'player2_sets' : item[5]
                }
    
                #yield or give the scraped info to scrapy
                yield scraped_info
        

            

Мы будем благодарны за помощь Ant.

1 Ответ

0 голосов
/ 03 августа 2020

Ваш XPath ничего не выбирает. Должно быть td[12] вместо td[13].

substring-after(//tr/td[13]/a/@href, "/match-detail/?id=")

Лучше использовать относительный:

//table[@class="result"]//a[contains(@href,"match-detail")]/@href

Но проблема не в этом. В XPath 1.0 функции substring будут выводить только результат функции, примененной к первому узлу, когда XPath возвращает несколько узлов.

Используйте Python для создания списка. Возьмите значения, затем замените бесполезные части на re.sub. Добавьте эти строки в свой код, чтобы сгенерировать список идентификаторов:

import re
data = response.xpath('//table[@class="result"]//a[contains(@href,"match-detail")]/@href').extract()
ids=[re.sub('^.+=','',el) for el in data]

Вывод для этой страницы : 262 элемента.

['789669', '779307', '786865', '789668', '786866',..., '1892793', '1892795', '1892802', '1892794', '1892955']
...