2012-10-25 3 views
5

나는 XPath에 익숙하지 않으며 나에게 약간 까다로 보인다. 때로는 그것이 작동해야한다고 생각하는 방식으로 작동하지 않는 경우가 있습니다.nokogiri와 함께 XPath; 자습서/예제?

XPath와 Nokogiri를 사용하여 웹 사이트에서 데이터를 긁을 때 웹 사이트가 복잡한 구조를 가지고 있으면 어려워집니다. 필자는 FirePath를 사용하여 요소의 XPath를 가져 왔지만 때로는 작동하지 않는 것처럼 보입니다. 브라우저에서 추가 한 태그 (예 : tbody)를 삭제해야합니다.

XPath와 Nokogiri의 좋은 자습서와 예제가 있는지 정말 알고 싶습니다. 나는 구글 검색 후에 많은 것을 발견 할 수 없었다.

+0

Nokogiri의 멋진 점 중 하나는 CSS 접근 기능을 지원한다는 것입니다. 때로는 CSS가 알아낼 수있는 더 빠른 경로이며 때로는 XPath가 있습니다. 필요한 경우 교환 할 수 있도록 자유롭게 사용하십시오. –

+0

예, 저는 CSS 선택기와 XPath를 둘 다 사용합니다. 두 가지를 함께 사용하면 더욱 강력 해집니다. –

답변

14

Nokogiri 또는 임의의 XML/HTML 파서를 사용하여 요소 또는 요소 그룹을 찾는 가장 큰 트릭은 짧은 접근 코드로 시작하여 찾고자하는 것의 일반적인 주변으로 들어간 다음 반복적으로 추가하는 것입니다 당신이 원하는대로 가질 때까지, 당신이 가면서 잘 조정해라.

두 번째 트릭은 //을 사용하여 문서의 루트에서 시작하려는 경우를 제외하고는 /이 아니라 XPath를 시작하는 것을 기억해야합니다. //은 Linux의 명령 행에서 '**/*' 와일드 카드와 유사합니다. 그것은 사방을 검색합니다.

또한 브라우저에서 제공하는 XPath 또는 CSS 접근자를 신뢰하지 마십시오. 그들은 보았 듯이 tbody을 포함하여 HTML 소스에 대한 모든 종류의 픽스 업을 수행합니다. 대신 Ruby의 OpenURI 또는 ​​curl 또는 wget을 사용하여 원시 소스를 검색하고 vi 또는 vim과 같은 편집기를 사용하거나 less 또는 cat을 화면에 사용하십시오. 그렇게 파일을 변경할 기회가 없습니다.

마지막으로, XPath를 사용하여 검색을 청크로 분해 한 다음 Ruby가 반복 할 수있게하려면 유지하기가 어렵거나 깨지기 쉬운 복잡한 XPath를 시도하는 것보다 쉽습니다.

Nokogiri 그 자체는 매우 쉽습니다.대다수의 작업은 두 가지 방법 즉, searchat의 간단한 조합입니다. 둘 다 CSS 또는 XPath 선택기를 사용합니다. search은 형제 메서드 인 xpathcss과 함께 NodeSet을 반환합니다.이 노드는 기본적으로 반복 할 수있는 노드 배열입니다. at, css_atxpath_at은 CSS 또는 XPath 접근 자와 일치하는 첫 번째 노드를 반환합니다. 이 모든 메소드에서 ...xpath 변형은 XPath를 허용하고 ...css 변형은 CSS 접근을 사용합니다.

일단 노드가 있으면 일반적으로 매개 변수를 추출하거나 텍스트/내용을 가져 오는 중 하나를 수행해야합니다. [attribute_to_get]text을 사용하여 쉽게 특성을 얻을 수 있습니다. 출력

require 'awesome_print' 
require 'nokogiri' 
require 'open-uri' 
doc = Nokogiri::HTML(open('http://www.example.com')) 
ap doc.search('a').map{ |a| [a['href'], a.text] }[0, 5] 

: 우리는 같은 것을 사용하여 페이지에있는 모든 링크를 검색하고 자신의 텍스트와 관련 HREF를 반환 할 수 있습니다 그 방법을 사용

[ 
    [0] [ 
     [0] "/", 
     [1] "" 
    ], 
    [1] [ 
     [0] "/domains/", 
     [1] "Domains" 
    ], 
    [2] [ 
     [0] "/numbers/", 
     [1] "Numbers" 
    ], 
    [3] [ 
     [0] "/protocols/", 
     [1] "Protocols" 
    ], 
    [4] [ 
     [0] "/about/", 
     [1] "About IANA" 
    ] 
] 
+0

Nokogiri는 쉽습니다. 내 대답에 내 추가 텍스트를 참조하십시오. –

8

처음에는 Nokogiri와 XPath를 사용하여 매우 가파른 학습 곡선이 있었지만 많은 시행 착오 끝에 이제는 두 가지 방법을 모두 사용할 수 있으므로 거기에 매달려 야합니다! Nokogiri는 정말 강력하고 배우는 가치가 있습니다.

튜토리얼/예제와 관련하여 Nokogiri tutorials page을 본 것으로 가정합니다.

XPath에서 나는 this summary in five paragraphs을 읽을 것을 제안합니다. 핵심 XPath는 매우 간단하고 직관적이지 않습니다. 나는 CSS를 기억하기가 훨씬 쉽다. 나는 내가 유일하다고 생각하지 않는다.

하지만 결국에는 자습서가 도움이되지만 가장 좋은 방법은 콘솔을 열어서 연결을 해제하고 연결을 해제하는 것입니다. 잠시 후에 그것은 의미를 갖기 시작할 것입니다.

+0

좋은 답변 주셔서 감사합니다. 저는 start_making_sense에 도착하기 위해 많은 연습을해야한다는 것을 알고 있습니다. 행운을 빈다. 다시 감사드립니다. –

+0

그리고, 나는이 대답에서도 xpath에 대한 좋은 점을 배웠다. http://stackoverflow.com/questions/2080799/how-to-use-xpath-nokogiri?lq=1 –

+0

다행이다. 행운을 빈다. –

4

가장 좋은 예를 그 나는 아래 링크에서 정말 유용한 것을 발견했다. xml 파일에서 정보를 탐색/검색하는 데 사용할 수있는 다양한 방법으로 어려움이 늘어나는 다양한 자습서를 보여줍니다.

http://www.zvon.org/xxl/XPathTutorial/General/examples.html

은 너무 유용 찾아 낸다! 행운을 비네!