2017-09-04 1 views
0

Ich versuche, Bild-URL mit Nokogiri zu extrahieren. Der untenstehende Code funktioniert, aber ich möchte effizienter und skalierbarer arbeiten und nicht unendlich viel tun.Rubin Nokogiri. Match dynamische Attributnamen

if doc.at_css("img[itemprop='image']")['src'] 
    img = doc.at_css("img[itemprop='image']")['src'] 
elsif doc.at_css("img[itemprop='image']")['data-src'] 
    img = doc.at_css("img[itemprop='image']")['data-src'] 
elsif doc.at_css("img[itemprop='image']")['data-react-src'] 
    img = doc.at_css("img[itemprop='image']")['data-react-src'] 
... 

Ich mag beide Ansatz lernen:

1) Plain Ruby-Weg: Wie Iterieren Namen wie [ 'src' Attribute 'Daten-src', 'Datenreagieren-src', etc ...]

2) Nokogiri regex oder XPath Ansatz:

'src' || 'data-src' || 'Daten reagieren-src

wie folgt aus:

doc.at_css("img[itemprop='image']")['src' || 'data-src' || 'data-react-src] 

Noch besser, speichern Attributnamen in einer Variablen:

my_attributes = [' src‘|| 'data-src' || ‚Daten reagieren-src] doc.at_css ("img [itemprop = 'Bild']") [my_attributes]

3) Wenn es einen effizienteren Ansatz als die vorherigen

Antwort

1

dies versuchen.:

attributes = %w[src data-src data-react-src] 
elem = doc.at_css("img[itemprop='image']") 
attr = attributes.find { |attr| elem[attr] } 
doc[attr] if attr 

Was es tut:

  1. Hält die Liste der statischen und dynamischen Eigenschaften. Fügen Sie in Zukunft mehr hinzu. Reihenfolge der Liste ist wichtig [ref # 3]
  2. elem enthält das Element (Nokogiri::XML::Element). Wir wollen es nicht mehrmals abrufen, um es zu optimieren.
  3. attr enthält das erste Attribut welches Element reagiert auf. Wenn src gefunden wird, versucht es nicht, in data-src und so weiter zu finden. Auf diese Weise haben wir die Iterationen optimiert.
  4. Geben Sie den Wert attr ibute zurück, wenn das Attribut verfügbar ist.

Ich hoffe, es hilft.