Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 不带下一个链接的Scrapy parse分页_Parsing_Scrapy_Web Crawler - Fatal编程技术网

Parsing 不带下一个链接的Scrapy parse分页

Parsing 不带下一个链接的Scrapy parse分页,parsing,scrapy,web-crawler,Parsing,Scrapy,Web Crawler,我试图在没有下一个链接的情况下解析分页。html如下所示: <div id="pagination" class="pagination"> <ul> <li> <a href="//www.demopage.com/category_product_seo_name" class="page-1 ">1</a>

我试图在没有下一个链接的情况下解析分页。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>
有没有好的方法来解析这个分页?谢谢大家

PS:我也检查了这些答案:


一种解决方案是刮取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
属性包含指定字符串的元素。(我目前无法测试这段代码是否有效,但这种风格的东西应该可以做到这一点)


您只需获取所有分页链接,并在每次必须调用以下代码时在循环中运行它,选择器将返回可用的分页链接。您不必担心重复的URL,因为scrapy将为您处理此URL。您也可以使用刮擦规则

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

谢谢你的回复,但正如你所说,这不是一个好的解决方案。这只是一个结果。我有几个这样的结果,有些结果是50页,有些结果是5页。我已经测试过了,下一个url返回为空。嗨,我忘了给你的解决方案提供反馈。经过一点修改,我觉得很好。谢谢你的回复,但我想一定有别的办法。在我问这个问题之前,我对这个response.css('div.pagination ul li a::attr(href)').extract()有相同的解决方案
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
         )
 response.css('.pagination ::attr(href)').getall()