2016-11-25 45 views
0

我正在爲相同的信息刮~10個網站,並且目前每個人都有自己的腳本。這些腳本都具有相同的基礎(遍歷可用頁面,刮取信息,保存它),但具有不同的屬性。重構Ruby刮碼(具有不同的屬性)

舉個例子,這些都是我是如何從兩頁提取author元素的例子:

page.at('b[itemprop="author"]').children.text.strip 
page.at('.author-username').text.strip 

我的目標是重構這個所以主要的邏輯是由一類處理,但我根據來源,無法弄清楚如何通過上述提取器。我知道我可以pass CSS selectors as arguments,但正如你所看到的,每個提取都有一些額外的邏輯。

雖然我可以有一個單獨的方法來處理這個問題(如上一個鏈接中所述),但這將很快失去約10個來源。

重構此代碼的最佳方式是什麼?

回答

0

我可能會去散列。

假設沒有太多細節,將其全部置於Rosetta Stone散列中,爲每個頁面提供相關信息。這可以與case...when語句一起使用來加載相關詳細信息。

喜歡的東西:

site_attributes = { 
    site_1: ['attribute_1', 'attribute_2', ... ], 
    site_2: ['attribute_3', 'attribute_4', ... ], 
    ... 
} 

,如果你需要調用不同的屬性的結果不同的方法,它可能需要稍微複雜一些。然後,您的每個網站的屬性數組將需要散列而不是字符串。喜歡的東西:

[ 
    { 
    attr: 'attribute_1', 
    methods: [:children, :text, :strip] 
    }, { 
    attr: 'attribute_2', 
    methods: [:text, :strip] 
    }, 
    ... 
] 

然後你就可以通過each的屬性,使用他們page.at(),並且反覆呼籲的結果的其他方法。

+0

感謝您的回答Scott,這很有幫助。請您詳細說明我將如何處理通過這些字符串提供的方法調用('['children','text','strip']')? 作爲一個例子,我將如何運行'attribute_1.children.text.strip'? – Manonthemoon

+0

啊我想通了,我使用'page.send()'調用每個方法。 – Manonthemoon

+0

對。實際上,這些方法列表應該是符號而不是字符串。要麼應該工作相同,但符號更有效率的內存。 –

相關問題