найти правильный селектор для нумерации страниц с помощью скрапа - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь извлечь данные из этого форума:

https://schwangerschaft.gofeminin.de/forum/all

Я получаю данные с первой страницы. Я использую селектор css 'li.selected > a::attr(href)' К сожалению, я не могу получить все другие данные с других страниц.

Каков правильный путь для селекторов xpath или css для нумерации страниц?

Python:

import scrapy

class ForumSpider(scrapy.Spider):
    name = "pregnancy"

    def start_requests(self):
        url = 'https://schwangerschaft.gofeminin.de/forum/all'
        yield scrapy.Request(url, self.parse)


    def parse(self, response):
        for thread in response.css('div.af-thread-item'):
            yield{
                'threadTitle': thread.css('span.thread-title::text').extract_first(),
                'username': thread.css('div.user-name::text').extract_first()
            }
        next_page = response.css('li.selected > a::attr(href)').extract_first()
        if next_page is not None:
            yield scrapy.Request(response.urljoin(next_page))

HTML:

<nav class="af-pagination " role="navigation"><ul><li class="selected">
<a href="https://schwangerschaft.gofeminin.de/forum/all">1</a></li><li>
<a href="https://schwangerschaft.gofeminin.de/forum/all/p2">2</a></li><li>
<a href="https://schwangerschaft.gofeminin.de/forum/all/p3">3</a></li><li>
<a href="https://schwangerschaft.gofeminin.de/forum/all/p4">4</a></li><li>
<a href="https://schwangerschaft.gofeminin.de/forum/all/p5">5</a></li><li>
<a href="https://schwangerschaft.gofeminin.de/forum/all/p6">6</a></li><li>
<a href="https://schwangerschaft.gofeminin.de/forum/all/p7">7</a></li><li>
<a href="https://schwangerschaft.gofeminin.de/forum/all/p8">8</a></li><li>
...

ссылка на следующую страницу: https://schwangerschaft.gofeminin.de/forum/all/p2

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Учитывая способ построения этого конкретного сайта для навигации, я бы хотел использовать xpath в этих ситуациях. Учитывая, что текущая страница будет иметь класс «selected», я выбрал бы «selected» класс и затем использовал бы синтаксис «follow-sibling» с индексом 1, чтобы получить самые следующие теги.

В вашем случае:

response.xpath("//li[@class='selected']/following-sibling::li[1]/a/@href").extract_first()

Таким образом, независимо от того, на какой странице вы находитесь, вы динамически выбираете «следующую» страницу.

0 голосов
/ 18 января 2019

Попробуйте response.css('link[rel=next]::attr(href)').get(), это должно работать.

...