Захватить весь текст из определенного класса, только если он является потомком другого класса - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь извлечь все «задания», которые есть у кого-то в профиле LinkedIn (только для образовательных целей), но я не могу найти правильный подход, используя BeautifulSoup.

Я заметил, что заголовок для Задания вкладываются следующим образом:

<div class="pv-entity__company-details">
  <div class="pv-entity__company-summary-info">
    <h3 class="t-16 t-black t-bold">
      <span class="visually-hidden">Company Name</span>
      <span>Morgan Stanley</span>
    </h3>
        <h4 class="t-14 t-black t-normal">
          <span class="visually-hidden">Total Duration</span>
          <span>2 yrs 7 mos</span>
        </h4>
  </div>
</div>

Я пытаюсь извлечь текст "Morgan Stanley" из каждого t-16 t-black t-bold НО ТОЛЬКО если он находится под pv-entity__company-summary-info div.

Попытка сделать что-то вроде этого:

all_jobs = ', '.join(sel.xpath('//*[contains(@class, "t-16 t-black t-bold")]/text()').extract())

Слишком много ложного текста, потому что есть много объектов, которые содержат класс t-16 t-black t-bold, которые не входят в класс pv-entity__company-summary-info.

Есть мысли?

1 Ответ

1 голос
/ 17 марта 2020

Вы не вставили слишком много html, но этот селектор работает:

all_jobs = ', '.join(sel.xpath('//*div[class="pv-entity__company-summary-info"]h3/span[text()]').extract())
# if you want just second span in the html above
all_jobs = ', '.join(sel.xpath('//*div[class="pv-entity__company-summary-info"]h3/span[2][text()]').extract())

xpath cheatsheet

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...