Извлечение нескольких селекторов с помощью скрапа - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть html-файл со следующей структурой:

<div class='past_financing section'><div class="section dsss17 startups-show-sections fpg76 past_financing _a _jm" data-id="32319" data-_tn="startups/show/sections/past_financing"><div data-id="32319" class=" dsss17 startups-show-sections fss49 startup_rounds _a _jm" data-_tn="startups/show/sections/startup_rounds"><ul class='startup_rounds with_rounds'><li class='first not_editing startup_round'>
<div data-id="56738" class=" dsr49 fpe53 _a _jm" data-_tn="startup_rounds/profile"><div class='show section'>
<div class='details inner_section'>
<div class='header'>
<div class='type'>
Series A
</div>
</div>
<div class='raised'>
$1,500,000
</div>
</div>
</div>
</div>
</li><li class='first not_editing startup_round'>
<div data-id="72884" class=" dsr49 fpe53 _a _jm" data-_tn="startup_rounds/profile"><div class='show section'>
<div class='g-sash green left'>
<div class='copy'>Exit</div>
</div>
<div class='details inner_section'>
<div class='header'>
<div class='type'>
Acquired
by Travora Media - New York, NY
</div>
<div class='date_display'>Apr  1, 2012</div>
</div>
<div class='raised unknown'>
Unknown
</div>
</div>
<div class='participant_list inner_section'>
<div class='participant g-lockup'>
<div class='photo'>
<a class="startup-link" title="Travora Media - New York, NY" data-type="Startup" data-id="242501" href="https://angel.co/travora-media-new-york-ny"><img class="angel_image" alt="Travora Media - New York, NY" src="https://angel.co/images/shared/nopic_startup.png" /></a>
</div>
<div class='text'>
<div class='name'>
<a class="startup-link" data-type="Startup" data-id="242501" href="https://angel.co/travora-media-new-york-ny">Travora Media - New York, NY</a>
</div>
<div class='tags'>

</div>
</div>
</div>
</div>
</div>
</div>
</li><li class='first not_editing startup_round'>
<div data-id="12714" class=" dsr49 fpe53 _a _jm" data-_tn="startup_rounds/profile"><div class='show section'>
<div class='details inner_section'>
<div class='header'>
<div class='type unknown'>
No Stage
</div>
<div class='date_display'>Dec  3, 2010</div>
</div>
<div class='raised'>
<a rel="nofollow" target="_blank" href="http://venturebeat.com/2010/12/03/nileguide-funding/">$3,500,000</a>
</div>
<a class="read_press" rel="nofollow" target="_blank" href="http://venturebeat.com/2010/12/03/nileguide-funding/">Read Press</a>
</div>
</div>
</div>
</li>

Я хочу извлечь информацию для каждого элемента li в ul.Я ищу данные раунда, даты и деньги, собранные во время этого раунда.

До сих пор я пришел со следующими выражениями xPath:

    funding_round = '//div[@class="past_financing section"]/div/div/ul[@class="startup_rounds with_rounds"]/li/div/div/div/div/div[@class="type"]/text()'
    funding_date = '//div[@class="past_financing section"]/div/div/ul[@class="startup_rounds with_rounds"]/li/div/div/div/div/div[@class="date_display"]/text()'

    founders_url = response.xpath(founder_url_path).extract()
    founder_name = response.xpath(founder_name).extract()

Хотя он отлично работает как вывод, яполучить два разделенных списка

['\nSeries A\n', '\nAcquired\nby Travora Media - New York, NY\n', '\nSeries B\n', ]

['Apr  1, 2012', 'Dec  3, 2010', 'Jun  5, 2008']

Конкатенация тоже не помогла.

 funding_round = response.xpath(funding_round).extract() + response.xpath(funding_date).extract()

Проблема в том, что структура сайта несовместима, некоторые элементы li не имеютинформация о дате или деньгах.Я бы лучше хотел получить кортеж объектов из одного запроса.

Окончательный список должен выглядеть следующим образом:

[('\nSeries A\n', ) ('\nAcquired\nby Travora Media - New York, NY\n','Apr  1, 2012'), (, 'Dec  3, 2010'), ('\nSeries B\n','Jun  5, 2008') ]

Возможно ли использовать scrapy?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Разве вы не можете остановить путь на '//div[@class="past_financing section"]/div/div/ul[@class="startup_rounds with_rounds"]/li/div/div/div/div/' (или даже на один шаг выше, кажется), а затем обработать / проанализировать соответствующие фрагменты HTML?
Первая часть другого ответа вряд ли будет работать,но вторая часть, работающая на уровне li, выглядит отлично!

0 голосов
/ 18 декабря 2018

У вас есть несколько вариантов, я буду использовать css selector для упрощения, но это будет то же самое, если использовать xpaths.

1) Если оба списка имеют одинаковый размер, вы можете использовать zip:

titles = response.css('li .type::text').extract()
raised = response.css('li .raised::text').extract()
list(zip(titles, raised))
>>> [('\nSeries A\n', '\n$1,500,000\n'),
     ('\nAcquired\nby Travora Media - New York, NY\n', '\nUnknown\n'),
     ('\nNo Stage\n', '\n')]

2) Если списки имеют разные размеры, вы можете перебирать элементы li:

for li_selector in response.css('li'):
    title =  li_selector.css('.type::text').extract_first()
    raised = li_selector.css('.raised::text').extract_first()
    # use title and raised vars

Обратите внимание, что в этом случае вы должны использовать extract_first, чтобы получить только первый элемент ине список элементов.Кроме того, некоторые из извлеченных значений будут None, в противном случае оба списка будут иметь одинаковый размер.

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