Ayant du mal à affecter Nokogiri élément à hachage de clé

voix
0

J'ai essayé d'apprendre Ruby pendant quelques mois maintenant et je pratique le grattage avec Nokogiri. Je suis gratter Techcrunch.com et saisir le titre, url et aperçu du texte de chaque article. Jusqu'à présent, j'ai:

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 (histoires) prend le hachage comme dans l'argument et l'utilise pour initialiser la classe de l'article comme ceci:

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

Quand je lance TestScraper :: Scraper.new ( https://techcrunch.com ) .scrape_tech_crunch

Je reçois:

[#<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/>

Comme vous pouvez le voir crée un objet avec le titre approprié et URL pour chaque instance de la classe d'article, mais il garde assignant le même texte d'aperçu à chaque instance de l'article. Il devrait y avoir 20 articles chacun avec son propre « aperçu », par « preview » Je veux dire le petit échantillon de l'article que vous obtenez avant de cliquer sur le lien pour lire l'article complet.

Désolé pour le long courrier. Je suis novice en la matière et ne peut pas sembler obtenir ce bon. Merci d'avance pour toute aide.

-ruby n00b

Créé 24/10/2019 à 12:03
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

La question que vous ayez est dû au fait que

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

sélectionne le même nœud pour chaque histoire, puisque vous l' appelez sur @docqui est le document mondial.

Essayez plutôt de trouver le haut du noeud le plus courant, et descendre à partir de là:

@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

Si l' une des méthodes utilisées pose des questions ont un regard sur la feuille de triche Nokogiri . Si vous avez des questions après ne pas avoir peur de demander à ce sujet dans les commentaires.

Créé 24/10/2019 à 13:48
source utilisateur

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