Ruby Nokogiri。匹配动态属性名称

时间:2017-09-04 23:07:00

标签: ruby xpath nokogiri dry

我正在尝试使用Nokogiri提取图片网址。 下面的代码有效,但我想以更有效和可扩展的方式进行,而不是无限制地使用elsif。

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

我想学习两种方法:

1)纯Ruby方式:像迭代['src', 'data-src', 'data-react-src', etc...]

这样的属性名称

2)Nokogiri regex或xpath,方法:

'src' || 'data-src' || 'data-react-src
像这样:

doc.at_css(“img [itemprop ='image']”)['src'|| 'data-src'|| “数据-反应-SRC]

更好的是,将属性名称存储在变量中:

my_attributes = ['src' || 'data-src' || 'data-react-src]

doc.at_css("img[itemprop='image']").[my_attributes]

3)如果有比以前更有效的方法

1 个答案:

答案 0 :(得分:1)

试试这个:

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

它的作用:

  1. 保存静态和动态属性列表。将来添加更多。列表顺序很重要[参考#3]
  2. elem包含元素(Nokogiri::XML::Element)。我们不想多次获取它来进行优化。
  3. attr包含第一个属性,其中元素响应。如果找到src,则不会尝试在data-src中查找,依此类推。这样我们优化了迭代。
  4. 如果属性可用,则
  5. 返回attr ibute处的值。
  6. 希望它有所帮助。