Python Скрап экстракт ребенка - PullRequest
2 голосов
/ 16 февраля 2020

У меня следующая ситуация:

<div class="question"> 
    <div class="post-layout">
        <div class="post-text">
            <p> Sample Question </p>
        </div>
    </div>
</div>

и

<div class="answer"> 
    <div class="post-layout">
        <div class="post-text">
            <p> Sample Answer </p>
        </div>
    </div>
</div>

Я хочу извлечь текст класса question отдельно от класса answer.

Я пытался: response.css('.post-text > p::text').extract(), но это извлекает вопрос и ответ вместе.

Я пытался: response.css('.question > .post-text > p::text').extract(), но ничего не возвращается.

Я также пытался: response.xpath(".//div[@class='question']/div[@class='post-text']/p//text()").extract() но ничего не возвращает.

Я новичок в Scrapy, поэтому, возможно, я делаю что-то не так ... любая помощь будет оценена !!

Спасибо!

1 Ответ

0 голосов
/ 16 февраля 2020

Вы рядом. > в вашем селекторе запрашивает у ребенка то, что вы выбираете. Поскольку <p> не является прямым потомком <div class="answer">, он не находит его. Вы можете исправить это, просто удалив его

question = response.css(".question p::text").get()
answer = response.css(".answer p::text").get()

Примечание. Я использую get() вместо extract() только потому, что это рекомендуемый способ сделать это сейчас.

Ваша вторая попытка не работает, потому что вам не хватает класса post-layout. Правильный способ использования этого подхода будет, например,

response.css('.question > .post-layout > .post-text > p::text')

. xpath эквивалентами являются

question = response.xpath('//div[@class="question"]//p/text()').get()
answer = response.xpath('//div[@class="answer"]//p/text()').get()
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...