2013-05-28 16 views
2

Я пытаюсь скрести сайты из http://expo.getbootstrap.com/Как получить атрибут HREF привязанного тега?

HTML, как это:

<div class="col-span-4"> 
    <p> 
    <a class="thumbnail" target="_blank" href="https://www.getsentry.com/"> 
     <img src="/screenshots/sentry.jpg"> 
    </a> 
    </p> 
</div> 

Мой Nokogiri-код:

url = "http://expo.getbootstrap.com/" 
doc = Nokogiri::HTML(open(url)) 
puts doc.css("title").text 
doc.css(".col-span-4").each do |site| 
    title=site.css("h4 a").text 
    href = site.css("a.thumbnail")[0]['href'] 
end 

Цель проста, получить href, <img> тег href и <title>, но он сохраняет отчетность:

undefined method [] for nil:NilClass 

в строке:

href = site.css("a.thumbnail")[0]['href'] 

Это действительно сводит меня с ума, потому что код, который я написал здесь на самом деле работает в другой ситуации.

+0

Что происходит, если вы пытаетесь site.css ("a.thumbnail ") ['href'] или site.css (" a.thumbnail ") ['href'] [0]? – Bala

+0

Он сообщает 'не может преобразовать String в Integer' в обеих ситуациях – cqcn1991

ответ

1

Вы не считаете, что не все .col-span-4 divs содержат миниатюру. Это должно работать:

url = "http://expo.getbootstrap.com/" 
doc = Nokogiri::HTML(open(url)) 
puts doc.css("title").text 
doc.css(".col-span-4").each do |site| 
    title = site.css("h4 a").text 
    thumbnail = site.css("a.thumbnail") 
    next if thumbnail.empty? 
    href = thumbnail[0]['href'] 
end 
+0

' next if thumbnail.empty ?; href = thumbnail [0] ['href'] 'может быть написано более лаконично как' href = thumbnail [0] ['href'], если thumbnail.empty? ' –

+0

это работает! На самом деле я рассмотрел ситуацию, которую вы заявили здесь. но не записывать его выше. Я использую 'if title', чтобы решить, идти ли для href. Однако заголовка 'if title' недостаточно. 'if! title.empty?' является рабочим решением – cqcn1991

2

Я хотел бы сделать что-то вроде:

require 'nokogiri' 
require 'open-uri' 
require 'pp' 

doc = Nokogiri::HTML(open('http://expo.getbootstrap.com/')) 

thumbnails = doc.search('a.thumbnail').map{ |thumbnail| 
    { 
    href: thumbnail['href'], 
    src: thumbnail.at('img')['src'], 
    title: thumbnail.parent.parent.at('h4 a').text 
    } 
} 

pp thumbnails 

, который после запуска имеет:

# => [ 
    { 
    :href => "https://www.getsentry.com/", 
    :src => "/screenshots/sentry.jpg", 
    :title => "Sentry" 
    }, 
    { 
    :href => "http://laravel.com", 
    :src => "/screenshots/laravel.jpg", 
    :title => "Laravel" 
    }, 
    { 
    :href => "http://gruntjs.com", 
    :src => "/screenshots/gruntjs.jpg", 
    :title => "Grunt" 
    }, 
    { 
    :href => "http://labs.bittorrent.com", 
    :src => "/screenshots/bittorrent-labs.jpg", 
    :title => "BitTorrent Labs" 
    }, 
    { 
    :href => "https://www.easybring.com/en", 
    :src => "/screenshots/easybring.jpg", 
    :title => "Easybring" 
    }, 
    { 
    :href => "http://developers.kippt.com/", 
    :src => "/screenshots/kippt-developers.jpg", 
    :title => "Kippt Developers" 
    }, 
    { 
    :href => "http://www.learndot.com/", 
    :src => "/screenshots/learndot.jpg", 
    :title => "Learndot" 
    }, 
    { 
    :href=>"http://getflywheel.com/", 
    :src=>"/screenshots/flywheel.jpg", 
    :title=>"Flywheel" 
} 
] 
Смежные вопросы