2012-12-25 2 views
3

JavaScript를 사용하는 페이지에서 URL을 긁어 내려고했습니다. 페이지에 링크가있는 대신 여러 테이블 행에 대해 onClick 이벤트를 작성하여 행을 클릭하면 링크로 연결됩니다. 그들은 onClick 이벤트의 일환으로 페이지에이기 때문에, 여기서 일하지 않는 HREF 참조를 통해 링크를 찾고,JavaScript 'onclick window.open'이벤트에서 URL을 긁는 방법은 무엇입니까?

agent = Mechanize.new 
page = agent.get(url) 

page.links_with(:href => /^http?/).each do |link| 
    puts link.href 
end 

:하지만

내가 사용 기계화 URL을 긁어 시도

<tr onclick="window.open('/someurl');"> 

Mechanize 또는 다른 보석을 사용하여 페이지의 코드를 구문 분석하고 onClick 이벤트에 포함 된 URL을 추출하는 좋은 방법이 있습니까?

바로 사용할 수있는 솔루션이 없다면 어떻게해야할까요? 나는 정규 표현식에 약간 새로운 것이므로 아직 내 자신 만의 것을 함께 모을 수는 없다.

+1

같은 형식으로 모든 링크 있습니까? – Brad

+0

가능하면 사람들이 소스를 볼 수 있도록 스크래핑하는 페이지에 URL을 추가하십시오. 답변을 빨리 얻을 수 있도록 도와줍니다. – Casper

답변

4

파서를 사용해야합니다. Regex와 HTML/XML은 잘 어울리지 않습니다. 왜냐하면 정규 표현식은 HTML과 XML 문서에 포함 된 불규칙성을 처리 할 수 ​​없기 때문입니다. 매우 간단한 작업은 패턴과 함께 작동하지만 HTML이 변경되면 쉽게 깨지기 쉽고 쉽게 깨지는 것을 알 수 있습니다.

기계화를위한 루비는 내부적으로 Nokogiri을 사용하며, 이는 이러한 매개 변수를 얻는 훌륭한 방법입니다. 당신은 그것에서의 <tr> 태그를 찾을 수, 기계화의 내부 노코 기리 문서에 액세스 할 수 있습니다

require 'mechanize' 

page = Mechanize.new 
page = agent.get('http://somesite.foo.com') 

page.search('tr[onclick]').map{ |n| n['onclick'][/\(['"]([^)]+)['"]\)/, 1] } 

내가 직접 조각을 구문 분석 노코 기리를 사용하는 경우 :

require 'nokogiri' 

page = Nokogiri::HTML(%[<tr onclick="window.open('/someurl');">]) 
page.search('tr[onclick]').map{ |n| n['onclick'][/\(['"]([^)]+)['"]\)/, 1] } 
=> ["/someurl"] 
:

<tr onclick="window.open('/someurl');"> 

나는이 작업을 수행 할 수 있습니다

CSS 접근자인 'tr[onclick]'을 사용하여 검색 중이므로 특정 노드를 쉽게 찾을 수 있습니다. JavaScript, CSS 또는 jQuery를 알고 있다면 Nokogiri를 CSS에 내장 된 지원을 사용하여 쉽게 찾을 수 있습니다. 또한

,

n['onclick'][/\(['"]([^)]+)['"]\)/, 1] 

는 교대로 기록 될 수있다 :

n['onclick'][/\(([^)]+)\)/, 1][1..-2] 
+0

검색 및 매핑이 완벽하게 작동했습니다. 정규식을 다음과 같이 해석해야합니까? 1) 열린 대괄호를 찾습니다. 2) 하나 또는 큰 따옴표를 찾습니다. 3) 닫지 않은 모든 문자를 찾습니다. 4) 닫는 인용 부호를 찾습니다. 5) 닫는 대괄호를 찾으십시오 ...? '1'인수가 전달한 것은 무엇입니까? 감사! –

+0

그것은 정규식을 읽는 방법입니다. '1 '은 당신이 알아낼 수있는 것을 의미합니다. 'String. []'에 대해서는 문서를 참조하십시오. –

관련 문제