2011-03-08 5 views
4

XPath 관련 문제를 해결하고 싶습니다.일반화 XPaths

사용자가 제공 한 여러 개의 Xpath를 일반화하여 모든 제공된 예제에 가장 잘 맞는 XPath를 얻으려고합니다. 이것은 내가 건축하고있는 웹 스크 레이 핑 시스템을위한 것입니다.

예 : 사용자가

좋은 예 (각 Google 뉴스 페이지에서 '스포트라이트'섹션에있는 링크를 가리키는) 다음 XPath의를 제공하는 경우 :

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3] /div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[1]/div[2]/a[@id='MAE4AUgAUABgAmoCdXM']/span 

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[6]/div[2]/a[@id='MAE4AUgFUABgAmoCdXM']/span 

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[12]/div[2]/a[@id='MAE4AUgLUABgAmoCdXM']/span 

나쁜 예 : (다른 섹션의 링크를 가리키며)

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='lt-col']/div[2]/div[@id='replaceable-section-blended']/div[1]/div[4]/div/h2/a[@id='MAA4AEgFUABgAWoCdXM']/span 

은 일반화하여 '스포트라이트'섹션의 모든 링크를 선택하는 xpath 표현식을 생성 할 수 있어야합니다. 당신이 친절하게 대해 이동하는 방법을 나에게 조언을 할 수

일반화 된 XPath를

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div/div[2]/a[@id='MAE4AUgLUABgAmoCdXM']/span 

(주어진 잘못된 XPath를 던질 수 있어야한다). 가장 긴 공통 부분 문자열 전략을 사용하려고 생각했지만 나쁜 예가 주어지면 지나치게 일반화 될 것입니다 (네 번째 예와 같이).이 영역에서 수행 된 라이브러리 나 오픈 소스 소프트웨어가 있습니까?

비슷한 게시물 (finding common ancestor from a group of xpath?Howto find the first common XPath ancestor in Javascript?)이 가장 긴 공통 조상에 관한 이야기입니다.

나는 firefox 확장 형식으로 자바 스크립트로 작성했습니다.

시간을내어 주시면 감사하겠습니다.

+0

문제가 무엇인지 명확하지 않습니다. "나쁜"XPath 표현식과 "좋은"Xpath 표현식이 무엇인지 정의하지 않았습니다. 또한 "나쁜"표현식이 입력되면 수행 할 작업을 정의하지 않았습니다. 질문을 편집하고 신중하게 가능한 한 정확하게 정의하십시오. –

+0

안녕하세요 Dimitre, 위의 예를 사용하여 사용자가 Google 뉴스의 주목받는 부분에서 모든 링크를 추출하려고한다고 가정하면 '스포트라이트'링크를 가리키는 xpath의 몇 가지 예를들 수 있습니다.그가 실수로 1 개의 '나쁜'예를 주었다고 가정 해 봅시다 - 다른 콘텐츠에 대한 임의의 xpath, 시스템이 함정에 빠져서 '나쁜'xpath를 포괄하도록 일반화하려고해서는 안됩니다. – netvarun

+0

@ user649851 : 주어진 노드 집합에서 더 많은 자손을 가진 가장 내적인 가장 가까운 조상이 필요합니다. 노드 집합의 노드가 동일한 문서에서 왔을 때, 그들은 적어도 하나의 공통 조상을 갖는다 : 최악의 경우 루트 요소. 그래서, 만약 당신이 가장 내면을 원한다면, 당신은 그 공통적 인 조상과 탈구를 비교해야한다는 것을 의미합니다. 또한, 당신은 당신이 고려하지 않을 노드 집합에서 노드를 선택 해야하는 거의 일반적인 싶어요. 이 두 프로세스는이 작업을 단일 XPath 식에 대해 불가능하게 만듭니다. –

답변

1

여기의 질문은 오토 마톤 최소화 문제입니다. 그래서 (Xpath1 | Xpath2 | Xpath3) 당신은 동일한 노드와 일치하는 최소한의 오토 마톤 Xpath4를 얻고 싶습니다. 또한 JPEG와 같이 정보 유실 여부에 대한 최소화에 대한 질문도 있습니다. 정확한 최소화를 위해서 당신은 "유한 상태 오토마타의 최소화를위한 알고리즘"을 google 할 수 있습니다.

가장 간단한 방법은 각 Xpath 연산자를 문자로 변환하고 문자열 목록에서 문자 기반 부분 문자열 찾기를 실행 한 후 공통 부분 순서를 찾는 것입니다. 예를 들어

adcba, acba, adba - common 하위 문자열 -> aba - 일반 reg exp -> a. * b. * - - xpath -> ...로 돌아 가기 -

대신 일반보다 덜 일반적인 설정을 시도 할 수도 있습니다. *

관련 문제