我正在尝试使用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
它的作用:
- 保留静态和动态属性的列表。将来添加更多。列表很重要[参考#3]
-
elem
保存元素(Nokogiri::XML::Element
)。我们不想多次进行优化。 -
attr
保留第一个属性哪个元素响应。如果找到src
,它将不会尝试在data-src
中找到。这样,我们优化了迭代。 - 如果属性可用,请在该
attr
ibute上返回该值。
希望它有帮助。