2014-10-15 7 views
0

나는 웹 사이트에서 정보를 얻으려고하고 있는데, 나는 몇 가지 다른 웹 사이트에 대해 작성하고 편집 한 스크립트를 가지고있다. 그러나이 사이트는 특히 슬픔을 일으킨다.nokogiri로 URL을 가져 오는 것

스크립트는 범주를 읽고 열려고하는 배열을 작성한 다음 각 페이지를 열어 각 범주 페이지의 각 제품에서 정보를 가져와야합니다. 배열을 구축하는 기능은 여전히 ​​잘 작동하고 있습니다.이 웹 사이트에서는 마크 업이 다르게 반응하는 것 같습니다.

나는이 마크 업

<li> 
     <a class="product-link" href="http://www.DOMAIN/producturl_1"> 
      <img class='product_image' src="image/path_1.jpg" title="" alt="PRODUCT NAME" /></a> 

     <a class="product-title" href="http://www.DOMAIN/producturl_1">PRODUCT NAME 1</a> 

     <span>PRICE</span> 
    </li><!----><li> 
    <a class="product-link" href="http://www.DOMAIN/producturl_2"> 
     <img class='product_image' src="image/path_2.jpg" title="" alt="PRODUCT NAME 2" /></a> 

    <a class="product-title" href="http://www.DOMAIN/producturl">PRODUCT NAME 2</a> 

    <span>PRICE</span> 
</li><!----><li> 
    <a class="product-link" href="http://www.DOMAIN/producturl_3"> 
     <img class='product_image' src="image/path_3.jpg" title="" alt="PRODUCT NAME 3" /></a> 

    <a class="product-title" href="http://www.DOMAIN/producturl_3">PRODUCT NAME 3</a> 

    <span>PRICE</span> 
</li><!----><li> 
    <a class="product-link" href="http://www.DOMAIN/producturl"> 
     <img class='product_image' src="image/path.jpg" title="" alt="PRODUCT NAME" /></a> 

    <a class="product-title" href="http://www.DOMAIN/producturl">PRODUCT NAME</a> 

    <span>PRICE</span> 
</li> 

내 스크립트에서 읽을 필요가;

각 제품은 제가 URL이 내 태그를 정의하려는 제품의 URL을 잡기 위해

page.css('li').each do |product| 
    # ... 
end 

내가 그런 보통

product.css('.product-title').text.strip 

와 제품 이름을 선택할 수있는 <li> 태그 내에 새 행을 없애기 위해 href와 gsub의 내용을 잡으려고 이와 같은 것을 사용하십시오.

product.css('.product-title')[:href].gsub(/\n/,"") 
이 경우 3,691,363,210

, 나는 그것이 href을 읽을 얻을 수있는 방법

./script.rb:52:in []: no implicit conversion of Symbol into Integer (TypeError) 
    from ./script.rb:52:in block in <main> 
    from /usr/local/lib/ruby/gems/2.0.0/gems/nokogiri-1.6.3.1/lib/nokogiri/xml/node_set.rb:237:in block in each 
    from /usr/local/lib/ruby/gems/2.0.0/gems/nokogiri-1.6.3.1/lib/nokogiri/xml/node_set.rb:236:in upto 
    from /usr/local/lib/ruby/gems/2.0.0/gems/nokogiri-1.6.3.1/lib/nokogiri/xml/node_set.rb:236:in each 
    from ./script.rb:39:in <main> 

받고 있어요? 다른 웹 사이트에서 작동 할 때 왜이 오류가 발생하는지 알 수 없습니다.

답변

1

product.css('.product-title')은 배열과 비슷한 NodeSet을 반환합니다.

product.css('.product-title').first['href'] #=> "http://www.DOMAIN/producturl" 
product.css('.product-title')[0]['href'] #=> "http://www.DOMAIN/producturl" 

또는 at_css 바로 가기 :

product.at_css('.product-title')['href'] #=> "http://www.DOMAIN/producturl" 

더 완벽한 예 :

require 'nokogiri' 

page = Nokogiri::HTML(<<-HTML) 
<li> 
    <a class="product-link" href="http://www.DOMAIN/producturl"> 
    <img class='product_image' src="image/path.jpg" title="" alt="PRODUCT NAME" /> 
    </a> 
    <a class="product-title" href="http://www.DOMAIN/producturl">PRODUCT NAME</a> 
    <span>PRICE</span> 
</li> 
HTML 

page.css('li').each do |product| 
    puts product.at_css('.product-title')['href'] 
end 

출력 :

,691

어느 첫 번째 요소를 얻을 수 first 또는 [0]를 사용

http://www.DOMAIN/producturl 
+0

답장을 보내 주셔서 대단히 감사합니다. 실제로'at_css' 옵션을 시도했지만이 오류를 반환합니다. './script.rb:52:in 블록 내

: 정의되지 않은 메소드 [] for nil : NilClass (NoMethodError) ' 첫 번째 제안에서도 같은 오류가 발생합니다. – James

+0

@James 이것은'css ('. product-title')'이 빈'NodeSet'을 반환하기 때문입니다. 즉,'class = "product-title"'을 가진 요소가 없습니다. 'product.at_css ('. product-title') ... ' – Stefan

+0

요소가 존재하지만 실제로 문제없이 제품 제목 클래스의 텍스트를 가져올 수 있습니다. – James

관련 문제