2016-05-21 2 views
1

Я делаю рубиновый веб-скребок для сбора информации. В HTML страницы, которую я хочу, чтобы скоблить, есть 3 равные пролеты в статье:Ruby - Скребковые конкатенатные строки

<article> 
    <div class="item item_contains_branding" data-adid="1234567"> 
     <div class="clearfix" style="display: block;"> 
     <div class="item-multimedia "> 
      ... 
     </div> 
     <div class="item-info-container"> 
      <div class="logo-branding"> 
      ... 
      </div> 
        <a href="/link/1" class="item-link " title="title 1" data-xiti-click="listado::enlace">title 1</a> 
      <div class="row price-row clearfix"> <span class="item-price">200<span>€</span></span> </div> 
      <span class="item-detail">T2 <small></small></span> <span class="item-detail">20 <small>m²</small></span> <span class="item-detail"> <small> more details 1</small></span> 
       <p class="item-description">description...</p> 
      <div class="item-toolbar clearfix"> 
      ... 
      </div> 
     </div> 
     </div> 
    </div> 
</article> 
<article> 
    <div class="item item_contains_branding" data-adid="1234567"> 
     <div class="clearfix" style="display: block;"> 
     <div class="item-multimedia "> 
      ... 
     </div> 
     <div class="item-info-container"> 
      <div class="logo-branding"> 
      ... 
      </div> 
        <a href="/link/2" class="item-link " title="title 2" data-xiti-click="listado::enlace">title 2</a> 
      <div class="row price-row clearfix"> <span class="item-price">300<span>€</span></span> </div> 
      <span class="item-detail">T5 <small></small></span> <span class="item-detail">50 <small>m²</small></span> 
       <p class="item-description">description...</p> 
      <div class="item-toolbar clearfix"> 
      ... 
      </div> 
     </div> 
     </div> 
    </div> 
</article> 
<article> 
    <div class="item item_contains_branding" data-adid="1234567"> 
     <div class="clearfix" style="display: block;"> 
     <div class="item-multimedia "> 
      ... 
     </div> 
     <div class="item-info-container"> 
      <div class="logo-branding"> 
      ... 
      </div> 
        <a href="/link/3" class="item-link " title="title 3" data-xiti-click="listado::enlace">title 3</a> 
      <div class="row price-row clearfix"> <span class="item-price">500<span>€</span></span> </div> 
      <span class="item-detail">T1 <small></small></span> <span class="item-detail">100 <small>m²</small></span> <span class="item-detail"> <small> more details 3</small></span> 
       <p class="item-description">description...</p> 
      <div class="item-toolbar clearfix"> 
      ... 
      </div> 
     </div> 
     </div> 
    </div> 
</article> 

Однако, некоторые из статей не имеют последний срок (с «более подробно»)

в настоящее время я использую этот код:

#first loop to find the title 
page.css('a.item-link').each do |line| 
    puts line.text 
end 
#Second loop to find the price 
page.css('span.item-price').each do |line| 
    puts line.text 
end 
#third loop to find the details 
page.css('span.item-detail').each do |line| 
    line.text 
end 

Я использую камень Nokogiri и открытым URI для извлечения и анализа файла.

Как я могу объединить 3 пролета (некоторые статьи имеют только два пролета в классе «item-detail») и печатать их на экране?

Мой желаемый результат:

title 1 
title 2 
title 3 
200€ 
300€ 
500€ 
T2 
T5 
T1 
20 m² 
50 m² 
100 m² 
more details 1 
" " 
more details 3 

Некоторые из статей не имеют третий срок (с «подробнее п»), так что если это так, я напечатает «». Моя цель - записать результаты в CSV-файл.

+1

Пожалуйста редактировать свой вопрос, чтобы включить ваш желаемый результат. –

+0

Возможно, посмотрите на 'reduce' – Michael

+0

ОК, я вижу, что вопрос изменился, и ожидается, что выход будет выполнен. Ожидаемый результат не коррелирует с входным HTML вообще. В примере нет названия, цены или деталей, так что буквально нет способа удовлетворительно ответить на вопрос. Укажите подходящий (реалистичный) ввод и примеры того, какие части ввода вы ожидаете согласовать с какими частями вывода. Как я уже сказал, вопрос не в том, что он не отвечает. –

ответ

1

Это код, который работает для ввода образца, хотя мне пришлось немного изменить входной XML, чтобы он содержался в одном узле HTML (<document>), чтобы быть правильно распознаваем:

require "nokogiri" 

html = <<HTML 
<document> 
<article> 
    <div class="item item_contains_branding" data-adid="1234567"> 
     <div class="clearfix" style="display: block;"> 
     <div class="item-multimedia "> 
      ... 
     </div> 
     <div class="item-info-container"> 
      <div class="logo-branding"> 
      ... 
      </div> 
        <a href="/link/1" class="item-link " title="title 1" data-xiti-click="listado::enlace">title 1</a> 
      <div class="row price-row clearfix"> <span class="item-price">200<span>€</span></span> </div> 
      <span class="item-detail">T2 <small></small></span> <span class="item-detail">20 <small>m²</small></span> <span class="item-detail"> <small> more details 1</small></span> 
       <p class="item-description">description...</p> 
      <div class="item-toolbar clearfix"> 
      ... 
      </div> 
     </div> 
     </div> 
    </div> 
</article> 
<article> 
    <div class="item item_contains_branding" data-adid="1234567"> 
     <div class="clearfix" style="display: block;"> 
     <div class="item-multimedia "> 
      ... 
     </div> 
     <div class="item-info-container"> 
      <div class="logo-branding"> 
      ... 
      </div> 
        <a href="/link/2" class="item-link " title="title 2" data-xiti-click="listado::enlace">title 2</a> 
      <div class="row price-row clearfix"> <span class="item-price">300<span>€</span></span> </div> 
      <span class="item-detail">T5 <small></small></span> <span class="item-detail">50 <small>m²</small></span> 
       <p class="item-description">description...</p> 
      <div class="item-toolbar clearfix"> 
      ... 
      </div> 
     </div> 
     </div> 
    </div> 
</article> 
<article> 
    <div class="item item_contains_branding" data-adid="1234567"> 
     <div class="clearfix" style="display: block;"> 
     <div class="item-multimedia "> 
      ... 
     </div> 
     <div class="item-info-container"> 
      <div class="logo-branding"> 
      ... 
      </div> 
        <a href="/link/3" class="item-link " title="title 3" data-xiti-click="listado::enlace">title 3</a> 
      <div class="row price-row clearfix"> <span class="item-price">500<span>€</span></span> </div> 
      <span class="item-detail">T1 <small></small></span> <span class="item-detail">100 <small>m²</small></span> <span class="item-detail"> <small> more details 3</small></span> 
       <p class="item-description">description...</p> 
      <div class="item-toolbar clearfix"> 
      ... 
      </div> 
     </div> 
     </div> 
    </div> 
</article> 
</document> 
HTML 

page = Nokogiri::XML(html) 
articles = page.css('article') 

articles.each do |article| 
    article.css('a.item-link').each do |link| 
    puts "#{link[:title]}" 
    end 
end 

articles.each do |article| 
    article.css('span.item-price').each do |price| 
    puts "#{price.text}" 
    end 
end 

articles.each do |article| 
    detail_spans = article.css('span.item-detail') 
    puts "#{detail_spans[0].text}" 
end 

articles.each do |article| 
    detail_spans = article.css('span.item-detail') 
    puts "#{detail_spans[1].text}" 
end 

articles.each do |article| 
    detail_spans = article.css('span.item-detail') 
    puts "#{detail_spans[2] ? detail_spans[2].text.strip : ' '.inspect }" 
end 

Этот код извлекает массив article элементов, а затем использует каждую статью элемент в массиве к объему дополнительных запросов для элементов, содержащихся внутри. Это дает возможность выполнять мелкозернистую отчетность отдельных значений элементов.

В последнем запросе item-detail используется определение элемента, чтобы определить, как выводить значения в присутствии элементов, которые могут не существовать. Другие запросы могут потребовать такой метод, в зависимости от фактического содержимого HTML-документа.

Таковы результаты:

title 1 
title 2 
title 3 
200€ 
300€ 
500€ 
T2 
T5 
T1 
20 m² 
50 m² 
100 m² 
more details 1 
" " 
more details 3 
+0

с вашим методом, результат становится лучше, но я хочу разделить «деталь-деталь» и распечатать весь первый пробел всех статей, следующий второй промежуток всех статей, и если статья имеет третью span напечатайте его, если он не печатает "" –

+0

@ absint0o Мне удалось получить парсер Nokogiri, как вы описали. Дополнительная информация была очень полезной. Спасибо! Проверьте ответ и сообщите мне, есть ли у вас вопросы или какие-либо разъяснения. –

+0

Спасибо вам большое за вашу помощь! теперь я получаю ошибку: imov_scrap.rb: 28: in 'block in

': undefined method' text' для nil: NilClass (NoMethodError) –

Смежные вопросы