我正在尝试使用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)如果有比以前更有效的方法
答案 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
它的作用:
elem
包含元素(Nokogiri::XML::Element
)。我们不想多次获取它来进行优化。attr
包含第一个属性,其中元素响应。如果找到src
,则不会尝试在data-src
中查找,依此类推。这样我们优化了迭代。 attr
ibute处的值。 希望它有所帮助。