Aveți probleme cu atribuirea Nokogiri elementelor hash cheie

voturi
0

Am încercat să învețe Ruby pentru câteva luni și am practicarea razuire cu Nokogiri. Sunt răzuire Techcrunch.com și hapsân titlu, URL-ul și textul de previzualizare a fiecărui articol. Până în prezent am:

require 'nokogiri'
require 'open-uri'

class TestScraper::Scraper
@doc = Nokogiri::HTML(open(https://techcrunch.com)


  def scrape_tech_crunch
    articles = @doc.css(h2.post-block__title).css(a)
    top_stories = articles.each do |story|
      stories = {
        :title => story.children.text.strip,
        :url => story.attribute(href).value,
        :preview => @doc.css(div.post-block__content).children.first.text
      }
      TestScraper::Article.new(stories)
    end
  end
end

TestScraper :: Article.new (povestiri) ia hash ca în argument și folosește-l pentru a inițializa articolul clasa astfel:

class TestScraper::Article
  attr_accessor :title, :url, :preview 

  @@all = []

  def initialize(hash)
    hash.each do |k, v|
      self.send #{k}=, v
    end
    @@all << self
  end

  def self.all
    @@all
  end
end

Când am rulat TestScraper :: Scraper.new ( https://techcrunch.com ) .scrape_tech_crunch

Eu iau:

[#<TestScraper::Article:0x00000000015f69e0
  @preview=
   \n\t\tSecurity researchers have found dozens of Android apps in the Google Play store serving ads to unsuspecting victims as part of a money-making scheme. ESET researchers found 42 apps conta
ining adware, \t,
  @title=
   Millions downloaded dozens of Android apps on Google Play infected with adware,
  @url=
   https://techcrunch.com/2019/10/24/millions-dozens-android-apps-adware/>,
 #<TestScraper::Article:0x00000000015f5658
  @preview=
   \n\t\tSecurity researchers have found dozens of Android apps in the Google Play store serving ads to unsuspecting victims as part of a money-making scheme. ESET researchers found 42 apps conta
ining adware, \t,
  @title=Netflix launches $4 mobile-only monthly plan in Malaysia,
  @url=
   https://techcrunch.com/2019/10/24/netflix-malaysia-mobile-only-cheap-plan/>

După cum puteți vedea, creează opoziție cu titlul și adresa URL corespunzătoare pentru fiecare instanță a clasei de articol, dar păstrează atribuirea același text de previzualizare pentru fiecare instanță de articol. Ar trebui să existe 20 de articole, fiecare cu propriile sale „preview“, prin „preview“ Vreau să spun mic eșantion de articol te înainte să faceți clic pe link-ul pentru a citi articolul integral.

Ne pare rău pentru post lung. Sunt nou la acest lucru și nu pot par pentru a obține acest drept unul. Multumesc pentru orice ajutor în avans.

n00b -ruby

Întrebat 24/10/2019 la 12:03
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
1

Problema cu dumneavoastră se datorează faptului că

@doc.css("div.post-block__content").children.first.text

selectează același nod pentru fiecare poveste, din moment ce - l suni pe @doccare este documentul global.

În loc să încerce să găsească partea de sus nod cele mai comune, și de călătorie în jos de acolo:

@doc.css('.post-block').map do |story|
  # navigate down from the selected node
  title   = story.at_css('h2.post-block__title a')
  preview = story.at_css('div.post-block__content')

  TestScraper::Article.new(
    title:   title.content.strip,
    href:    title['href'],
    preview: preview.content.strip
  )
end

Dacă oricare dintre metodele folosite ridică întrebări au o privire la foaia de ieftin Nokogiri . Dacă aveți întrebări , după care nu - ți fie frică să întreb despre asta în comentariile.

Publicat 24/10/2019 la 13:48
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more