[ruby] dezelfde code gebruiken voor verschillende variabelen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • dec0de
  • Registratie: Oktober 2017
  • Niet online
Mijn vraag
ik ben bezig met een project, en daarbij wil ik van websites data halen.

Relevante software en hardware die ik gebruik
linux x86_64 ubuntu(voor uitsluiten van problemen, ook op ubuntu werkt het niet), arch(main dev machine) en gentoo

ik heb geprobeert:
duckduckgo'en op dit probleem
hier valt helaas niks over te vinden, en ik wil niet 10 keer dezelfde code hebben, vooral omdat de gebruiker de optie krijgt om zelf websites toe te voegen via interactief, maar dat heb ik weggelaten, omdat er dan te veel probleempunten zijn.


Ruby:
1
2
3
4
5
6
7
8
9
10
11
poem1 =  Nokogiri::HTML(open('https://www.loc.gov/poetry/180/001.html'))
poem2 =  Nokogiri::HTML(open('https://www.loc.gov/poetry/180/002.html'))
poem3 =  Nokogiri::HTML(open('https://www.loc.gov/poetry/180/003.html'))

def pastePoem
   poem1.css('div#tab1').each do |el|
      el.to_s
      File.open('poems.json', 'w') do |f|
         f.puts el.text
      end
end

Beste antwoord (via dec0de op 03-02-2019 17:40)


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21:39

BoAC

Memento mori

Ruby is een object georiënteerde taal :) Maak dus gebruik van class en objecten.
Maak een array van je gewenste sites en itereer daar overheen.
Wat je ook kunt doen is een file aanmaken met voor iedere regel een site waar je overheen itereerd: https://ruby-doc.org/core-2.1.0/IO.html
Je kunt ook iedere regel weer splitten zodat je output bestanden kunt definiëren: https://ruby-doc.org/core-2.2.0/String.html

Succes :)

Alle reacties


Acties:
  • 0 Henk 'm!

  • ShitHappens
  • Registratie: Juli 2008
  • Laatst online: 20:08
Ruby niet kennende, maar is het een optie om een array van poems te maken, en dan de pastePoem functie over die array te laten itereren?

Acties:
  • 0 Henk 'm!

  • dec0de
  • Registratie: Oktober 2017
  • Niet online
ShitHappens schreef op zaterdag 2 februari 2019 @ 16:10:
Ruby niet kennende, maar is het een optie om een array van poems te maken, en dan de pastePoem functie over die array te laten itereren?
bedoel je dit?:

Ruby:
1
2
3
4
5
6
7
8
@poems = [poem1, poem2]

@poem1 = Nokogiri::HTML(open('https://www.loc.gov/poetry/180/001.html')), Nokogiri::HTML(open('https://www.loc.gov/poetry/180/001.html'))
@poem2 = Nokogiri::HTML(open('https://www.loc.gov/poetry/180/001.html')), Nokogiri::HTML(open('https://www.loc.gov/poetry/180/002.html'))

File.open('poems.json', 'w') do |f|
      f.puts @poems
    end

Acties:
  • 0 Henk 'm!

  • ShitHappens
  • Registratie: Juli 2008
  • Laatst online: 20:08
Bijna ja, al zou ik afstappen van losse variabelen te gebruiken voor elke poem. Wat als je er 5000 wilt opslaan?

Zou dan eerder neigen naar zoiets: (pseudocode, nogmaals: geen kennis van Ruby in 't bijzonder)
code:
1
2
3
4
5
6
7
@poems = [Nokogiri::HTML(open('https://www.loc.gov/poetry/180/001.html')), Nokogiri::HTML(open('https://www.loc.gov/poetry/180/002.html'))]

def pastePoem
   poems.each do |el|
      whatever je wilt doen per poem
   end
end


Dan kunnen daar later weer methodes bij om een poem toe te voegen of te verwijderen

Acties:
  • 0 Henk 'm!

  • dec0de
  • Registratie: Oktober 2017
  • Niet online
ShitHappens schreef op zaterdag 2 februari 2019 @ 16:29:
Bijna ja, al zou ik afstappen van losse variabelen te gebruiken voor elke poem. Wat als je er 5000 wilt opslaan?

Zou dan eerder neigen naar zoiets: (pseudocode, nogmaals: geen kennis van Ruby in 't bijzonder)
code:
1
2
3
4
5
6
7
@poems = [Nokogiri::HTML(open('https://www.loc.gov/poetry/180/001.html')), Nokogiri::HTML(open('https://www.loc.gov/poetry/180/002.html'))]

def pastePoem
   poems.each do |el|
      whatever je wilt doen per poem
   end
end


Dan kunnen daar later weer methodes bij om een poem toe te voegen of te verwijderen
thanks voor het antwoord!

daar is alleen een probleem mee, je moet alsnog elk individueel alsnog een naam geven, of je kunt niet alleen de poem er vanaf strippen }:|

ik had ook een theorethische oplossing, maar die is veel minder mooi...
de oplossing was wel slecht, en werkt niet, daarom vraag ik toch wat uitleg,

in ruby kun je een functie of variabel allen gebruiken in de functie, dus als ik
Ruby:
1
2
3
4
5
6
7
8
voorbeeld1 = gets.chomp

if voorbleed1 == "hallo"
  hello = "dit is grappig"
  puts hello
end

puts hello 


zal de laatste niet dit is grappig als output geven, maar de error code "hello is undefined" geven, dit is makkelijk te fixen met
Ruby:
1
2
3
4
5
6
7
8
voorbeeld1 = gets.chomp

if voorbleed1 == "hallo"
  @hello = "dit is grappig"
  puts @hello
end

puts @hello 


dan werkt het wel.
nu dacht ik. als ik nou
Ruby:
1
2
3
   poem1.css('div#tab1').each do |el|
      el.to_s
end


vervang door
Ruby:
1
 poem1.css('div#tab1').each do |@el| 

doet hij het niet, dus nu mijn vraag, waar staat de |el| voor, en hoe zou ik deze functie kunnen roepen vanuit een ander gedeelte?

[ Voor 6% gewijzigd door dec0de op 02-02-2019 17:15 ]


Acties:
  • 0 Henk 'm!

  • ShitHappens
  • Registratie: Juli 2008
  • Laatst online: 20:08
Even wachten dan tot er een daadwerkelijke Ruby-kenner voorbij komt, mijn antwoorden waren puur theoretisch op basis van Java/Javascript/PHP :+

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21:39

BoAC

Memento mori

Ruby is een object georiënteerde taal :) Maak dus gebruik van class en objecten.
Maak een array van je gewenste sites en itereer daar overheen.
Wat je ook kunt doen is een file aanmaken met voor iedere regel een site waar je overheen itereerd: https://ruby-doc.org/core-2.1.0/IO.html
Je kunt ook iedere regel weer splitten zodat je output bestanden kunt definiëren: https://ruby-doc.org/core-2.2.0/String.html

Succes :)

Acties:
  • +1 Henk 'm!

  • Swedish Clown
  • Registratie: November 2010
  • Laatst online: 10-04 22:41

Swedish Clown

Erlang <3

En om nog iets toe te voegen, gezien je voorbeelden is de hele URL gelijk behalve het laatste deel. Daar zou je eventueel nog wat mee kunnen doen ;) Telkens de integer ophogen tot je een 404 krijgt.

Jij weet waarschijnlijk beter hoe de URL is opgebouwd maar eventueel kan je daar iets mee doen zodat je niet alle URLS opslaat voor je je loop doorloopt.

Always looking for developers wanting to work with Erlang.


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 22:47
@Lets find it Misschien ook tijd om je een beetje te verdiepen in variable scope in Ruby http://ruby-for-beginners...iting_methods/scopes.html

Scope (= bereik) definieert de zichtbaarheid van je variable. In jouw voorbeeld gebruik je poem1 in de methode 'pastePoem'. Maar poem1 is onbekend in die method: het is in die method een local variable en die weet niets af van het feit dat je op het niveau van je script ook nog een poem1 hebt. Wat je dus moet doen is die poem1 doorgeven aan je method, zie http://ruby-for-beginners...g_methods/definition.html voor je een method maakt

Acties:
  • 0 Henk 'm!

  • dec0de
  • Registratie: Oktober 2017
  • Niet online
Brakkie41 schreef op zondag 3 februari 2019 @ 11:58:
En om nog iets toe te voegen, gezien je voorbeelden is de hele URL gelijk behalve het laatste deel. Daar zou je eventueel nog wat mee kunnen doen ;) Telkens de integer ophogen tot je een 404 krijgt.

Jij weet waarschijnlijk beter hoe de URL is opgebouwd maar eventueel kan je daar iets mee doen zodat je niet alle URLS opslaat voor je je loop doorloopt.
Nou, die is behoorlijk simpel, gewoon elke keer de laatste drie cijfers ophogen, tot de 016!

Ga ik zeker wat mee doen! :)
Pagina: 1