Разбиение на страницы разбора scrapy без следующей ссылки - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь разобрать разбиение на страницы без следующей ссылки. html любим:

<div id="pagination" class="pagination">
    <ul>
        <li>
            <a href="//www.demopage.com/category_product_seo_name" class="page-1 ">1</a>
        </li>
        <li>
            <a href="//www.demopage.com/category_product_seo_name?page=2" class="page-2 ">2</a>
        </li>
        <li>
            <a href="//www.demopage.com/category_product_seo_name?page=3" class="page-3 ">3</a>
        </li>
        <li>
            <a href="//www.demopage.com/category_product_seo_name?page=4" class="page-4 active">4</a>
        </li>
        <li>
            <a href="//www.demopage.com/category_product_seo_name?page=5" class="page-5">5</a>
        </li>
        <li>
            <a href="//www.demopage.com/category_product_seo_name?page=6" class="page-6 ">6</a>
        </li>
        <li>
                <span class="page-... three-dots">...</span>
        </li>
        <li>
           <a href="//www.demopage.com/category_product_seo_name?page=50" class="page-50 ">50</a>
        </li>
    </ul>   
</div>

Для этого html я попробовал этот xpath:

response.xpath('//div[@class="pagination"]/ul/li/a/@href').extract()
or 
response.xpath('//div[@class="pagination"]/ul/li/a/@href/following-sibling::a[1]/@href').extract()

есть ли хороший способ разобрать эту разбиение на страницы? Спасибо за всех.

PS: Я тоже проверил эти ответы:

Ответ 1

Ответ 2

Ответы [ 2 ]

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

Одно из решений - очистить x количество страниц, но это не всегда хорошее решение, если общее количество страниц не является постоянным:

class MySpider(scrapy.spider):
    num_pages = 10
    def start_requests(self):
        requests = []
        for i in range(1, self.num_pages)
            requests.append(scrapy.Request(
                url='www.demopage.com/category_product_seo_name?page={0}'.format(i)
            ))
        return requests

    def parse(self, response):
        #parse pages here.

Обновить

Вы также можете отслеживать количество страниц и делать что-то вроде этого. a[href~="?page=2"]::attr(href) будет нацеливаться на a элементы, атрибут href которых содержит указанную строку. (В настоящее время я не могу проверить, работает ли этот код, но что-то в этом стиле должно сработать)

class MySpider(scrapy.spider):
    start_urls = ['https://demopage.com/search?p=1']
    page_count = 1


def parse(self, response):
     self.page_count += 1
     #parse response

     next_url = response.css('#pagination > ul > li > a[href~="?page={0}"]::attr(href)'.format(self.page_count))
     if next_url:
         yield scrapy.Request(
             url = next_url
         )
0 голосов
/ 04 августа 2020

Вы можете просто получить все ссылки пагинации и запускать их внутри l oop каждый раз, когда вам нужно вызвать приведенный ниже код, и доступные ссылки пагинации будут возвращены селектором. Вам не нужно беспокоиться о повторяющихся URL-адресах, поскольку scrapy справится с этим за вас. Вы также можете использовать правила scrapy.

 response.css('.pagination ::attr(href)').getall()
...