Scrapy: выберите одного ближайшего брата и верните пустую строку, если ее нет - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть такая структура HTML:

<div>
    <h2>First title</h2>
    <p>First paragraph</p>

    <h2>Second title</h2>

    <h2>Third title</h2>
    <p>Third paragraph</p>
</div>

Мне нужно выбрать абзац после определенного заголовка c, например, первый абзац:

response.xpath(".//h2[contains(text(), 'First title')]/following-sibling::p/text()").extract()[0]

Это дает мне 'First paragraph'. Однако, если мне нужно выделить текст в Second title, я получу 'Third paragraph' вместо пустой строки.

Есть ли способ сделать это?

1 Ответ

1 голос
/ 18 февраля 2020

Вы получаете 'Third paragraph', поскольку используемый вами оператор получает первое наступление <p> после <h2>Second title</h2>. Вы можете сделать что-то вроде следующего.

paragraphs = []
for e in response.xpath(".//h2[contains(text(), 'title')]/following-sibling::*[1]"):
  if '<p>' in e.get():
    # there is a paragraph after the current title
    paragraphs.append(e.xpath('.//text()')[0].get())
  else:
    # there is no paragraph after the current title
    paragraphs.append('')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...