代码之家  ›  专栏  ›  技术社区  ›  Francisco Campaña

Ruby Nokogiri。匹配动态属性名称

  •  0
  • Francisco Campaña  · 技术社区  · 8 年前

    下面的代码可以工作,但我希望以更高效和可扩展的方式进行,而不是无限地进行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正则表达式或xpath,方法:

    'src' || 'data-src' || 'data-react-src
    

    文件。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) 如果有比以前更有效的方法

    1 回复  |  直到 7 年前
        1
  •  1
  •   kiddorails    8 年前

    试试这个:

    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. elem 保存元素( Nokogiri::XML::Element ). 我们不想多次获取它以进行优化。
    2. attr 属性 响应 . 如果 src data-src 等等这样我们优化了迭代。
    3. 返回该值 ibute,如果属性可用。

    希望有帮助。

    推荐文章