2012-07-01 3 views
2

Nokogiri 노드에서 href 링크를 검색하는 가장 좋은 방법을 찾으려고합니다. 내가Mechanize/Nokogiri에서 링크 가져 오기

mech = Mechanize.new 
mech.get(HOME_URL) 

mech.page.search('.listing_content').each do |business| 
    website = business.css('.website-feature') 
    puts website.class 
    puts website.inner_html 
end 

출력 기본적으로 =>

 
Nokogiri::XML::NodeSet 
<a href="http://urlofsite.com" class="track-visit-website no-tracks" onclick='omniture.callClick({"eVar6":6,"eVar9":1,"eVar21":"search_results","eVar50":null,"prop17":"cars","prop26":"64c15af0-a558-012f-a041-00215a4685f6","eVar42":"64c15af0-a558-012f-a041-00215a4685f6","prop27":6,"prop38":"search_results","prop39":1,"prop46":null,"events":"event6,event7","eVar51":optimostIDs.trialID.toString(),"eVar52":optimostIDs.segmentID.toString(),"eVar53":optimostIDs.creativeID.toString(),"eVar54":optimostIDs.subjectID.toString(),"prop47":null,"prop51":optimostIDs.trialID.toString(),"prop52":optimostIDs.segmentID.toString(),"prop53":optimostIDs.creativeID.toString(),"prop54":optimostIDs.subjectID.toString(),"prop56":"Saint+George%2C+UT","prop57":null,"prop58":false,"prop59":null,"eVar60":"relevancyTest2","prop60":"relevancyTest2","prop61":false,"prop62":null,"prop64":null,"prop67":null,"prop68":null,"prop70":null,"prop71":null});; atti_logs.attiClick({"iid":"651691e0-a558-012f-2ca7-18a9053c171a","lt":6,"ptid":"www.yellowpages.com","rid":"vendetta-236e7298-3a4f-4744-8ff5-4eb5fcc8e188","ypid":3848879,"lid":3848879,"vrid":"64c15af0-a558-012f-a041-00215a4685f6","nav":null});' rel="nofollow" target="_blank" title="Executive Service Ctr Website"><span class="raquo">»</span> Website</a> 

에서 어딘지 여기에 난 그냥 inner_html 밖으로 http://urlofsite.com을 얻을 필요가있다, 나는 그렇게하는 방법을 모르겠어요. 나는 CSS와 XPATH를 사용하여 그것을 읽었지만, 나는이 시점에서 일할 수 없다. 어떤 도움 주셔서 감사합니다

답변

3

먼저 NodeSet보다는 Nokogiri에게 노드를 가져 오라고 말하십시오. at_css은 노드를 검색하고 css은 배열과 같은 NodeSet을 검색합니다.

대신 :

website = business.css('.website-feature') 

시도 :

website = at_css('a.track-visit-website no-tracks') 

class="website-feature"와 함께 <a> 노드의 첫 번째 인스턴스를 검색 할 수 있습니다. 원하는 첫 번째 인스턴스가 아니라면 NodeSet을 잡고 인덱싱해야합니다. 주변 HTML이 없으면 더 많은 것을 돕기가 어렵습니다.

이 노드에서 href 매개 변수를 얻으려면, 단순히 해시 같은 노드를 치료 :

website['href'] 

은 반환해야합니다 :

irb(main):001:0> require 'nokogiri' 
=> true 
irb(main):002:0> 
irb(main):003:0* html = '<a class="this_node" href="http://example.com">' 
=> "<a class=\"this_node\" href=\"http://example.com\">" 
irb(main):004:0> doc = Nokogiri::HTML.parse(html) 
=> #<Nokogiri::HTML::Document:0x8041e2ec name="document" children=[#<Nokogiri::XML::DTD:0x8041d20c name="html">, #<Nokogiri::XML::Element:0x805a2a14 name="html" children=[#<Nokogiri::XML::Element:0x805df8b0 name="body" children=[#<Nokogiri::XML::Element:0x8084c5d0 name="a" attributes=[#<Nokogiri::XML::Attr:0x80860170 name="class" value="this_node">, #<Nokogiri::XML::Attr:0x8086047c name="href" value="http://example.com">]>]>]>]> 
irb(main):005:0> 
irb(main):006:0* doc.at_css('a.this_node')['href'] 
=> "http://example.com" 
irb(main):007:0> 
:

여기
http://urlofsite.com 

는 IRB에서 약간의 샘플입니다

+0

정보를 제공해 주셔서 감사합니다. at_css ('a.track-visit-website no-tracks')로 노드를 잡으려고 할 때마다 nilclass가 반환됩니다. 나는 내 포스트를 편집하려고 할 것이고, 모양을 가지고 간다 – ruevaughn

+0

그것을 다시 한번 지나고 난 후에 나는 당신이 기술했던 정확하게 것을 얻을 수 있었다. 도움을 주셔서 감사합니다, 주석 사람은 결국 마음을 가지고있다)) – ruevaughn

+0

나는 그것이 기쁘다. Nokogiri는 멋진 XML/HTML 파서이므로 해당 팀에 감사드립니다. –

관련 문제