2017-09-04 16 views
0

J'essaie d'extraire l'URL de l'image en utilisant Nokogiri. Le code ci-dessous fonctionne, mais je voudrais faire de manière plus efficace et plus évolutive, ne faisant pas elsif infiniment.Ruby Nokogiri. Faire correspondre les noms d'attributs dynamiques

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'] 
... 

Je voudrais apprendre à la fois l'approche:

1) façon ordinaire Ruby: Comme itérer attributs des noms tels que [ 'src', 'data-src', 'data-réagir-src', etc ...]

2) Nokogiri regex ou XPath, approche:

'src' || 'data-src' || 'Données réagissent-src

comme ceci:

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

Mieux encore, stocker les noms d'attribut dans une variable:

my_attributes = [' src » || 'data-src' || « Données réagissent-src] doc.at_css ("img [itemprop = 'image']") [my_attributes]

3) S'il y a une approche plus efficace que les précédentes

Répondre

1

essayer.:

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 

ce qu'il fait:

  1. contient la liste des attributs statiques et dynamiques. Ajouter plus à l'avenir. L'ordre de liste est important [réf # 3]
  2. elem contient l'élément (Nokogiri::XML::Element). Nous ne voulons pas le récupérer plusieurs fois pour l'optimiser.
  3. attr contient le premier attribut auquel l'élément répond à. Si src est trouvé, il ne cherche pas à trouver dans data-src et ainsi de suite. De cette façon, nous avons optimisé les itérations.
  4. Renvoyer la valeur à attr Ibute, si l'attribut est disponible.

Espérons que cela aide.