ruby
  • xpath
  • nokogiri
  • dry
  • 2017-09-04 215 views 0 likes 
    0

    我想使用Nokogiri提取圖像URL。 下面的代碼有效,但我希望以更高效和可擴展的方式進行操作,而不是無限制地執行elsif。Ruby Nokogiri。匹配動態屬性名稱

    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' 中,'數據-SRC的名字, '數據反應-src' 中,等...]

    2)引入nokogiri正則表達式或XPath,方法:

    'SRC' || 'data-src'|| '數據-反應-SRC

    這樣的:

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

    更好的是,存儲屬性名稱在一個變量:

    my_attributes = [' SRC」 || 'data-src'|| 「數據-反應-SRC] doc.at_css( 「IMG [itemprop = '圖像']」)[my_attributes]

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

    回答

    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. 返回值attr ibute,如果屬性可用。

    希望它有幫助。

    相關問題