2016-11-25 1 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

답장을 보내 주셔서 감사합니다. 도움이됩니다. 문자열 ('[ 'children', 'text', 'strip']')을 통해 제공되는 메서드 호출을 어떻게 수행하는지 자세히 설명해 주시겠습니까? 예를 들어'attribute_1.children.text.strip'을 어떻게 실행합니까? – Manonthemoon

+0

아, 알아 냈습니다. 각 메소드를 호출하기 위해'page.send ()'를 사용하고 있습니다. – Manonthemoon

+0

오른쪽. 그리고 정말로, 그 메소드 목록은 문자열이 아니라 기호가되어야합니다. 어느 쪽도 똑같이 작동해야하지만, 심볼은보다 효율적인 메모리입니다. –

관련 문제