Ruby Nokogiri.匹配动态属性名称



我正在尝试使用Nokogiri提取图像URL。下面的代码有效,但我想以更高效,更可扩展的方式进行操作,而不是无限地做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)普通红宝石方式:像迭代属性名称 ['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'||'data-react-src]

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

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

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

尝试以下:

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. 如果属性可用,请在该 attr ibute上返回该值。

希望它有帮助。

相关内容

  • 没有找到相关文章

最新更新