2014-10-01 1 views
0

я следующий HTML:Nokogiri разбора с помощью XPath возвращает пустую строку

<div> 
<table> 
    <tr> 
    <td> 

    <div class="w135"> 

    <div style="float: left; padding-right: 10px;" class="imageThumbnail playerDiv"> 
     <a href="/sport/tennis/2014/10/djokovic-through-wozniacki-out-china-open-2014101114115427766.html" id="ctl00_ctl00_DataList1_ctl00_Thumbnail1_lnkImage10" target="_parent"> 
     <img src="/mritems/imagecache/89/135/mritems/images/2014/10/1/2014101114447491734_20.jpg" id="ctl00_ctl00_DataList1_ctl00_Thumbnail1_imgSmall10" border="0" class="imageThumbnail"> 
      </a> 
    </div> 


    </div> 
    </td> 
    </tr> 
</table> 
</div> 

Когда я попытаться грабли, я получаю ошибку:

NoMethodError: undefined method `at_css' for ["id","ctl00_cphBody_ctl01_DataList1_ctl00_Thumbnail1_Layout17"]:Array 

Это код:

@request = HTTParty.get(url) 

@html = Nokogiri::HTML(@request.body) 

@html.css(".w135")[0].map do |item| 

    url = item.at_css("div.playerDiv a") 

    puts url.inspect 
end 

Я действительно не знаю, в чем проблема, и пытался это исправить некоторое время. Ошибка в этой строке url = item.at_css("div.playerDiv a")

Любое предложение оценено!

Благодаря

+0

Раздражающе, после простой публикации я решил это, изменив диапазон от '[0]' до фактического диапазона, например. '[0..1]'. Глупая ошибка. Благодарю. – Robbo

ответ

0

Я бы сделать это, используя что-то вроде:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<div> 
<table> 
    <tr> 
    <td> 

    <div class="w135"> 

    <div style="float: left; padding-right: 10px;" class="imageThumbnail playerDiv"> 
     <a href="/sport/tennis/2014/10/djokovic-through-wozniacki-out-china-open-2014101114115427766.html" id="ctl00_ctl00_DataList1_ctl00_Thumbnail1_lnkImage10" target="_parent"> 
     <img src="/mritems/imagecache/89/135/mritems/images/2014/10/1/2014101114447491734_20.jpg" id="ctl00_ctl00_DataList1_ctl00_Thumbnail1_imgSmall10" border="0" class="imageThumbnail"> 
      </a> 
    </div> 


    </div> 
    </td> 
    </tr> 
</table> 
</div> 
EOT 

puts doc.search('.w135 div.playerDiv a').map(&:inspect) 

Какие выходы:

# >> #<Nokogiri::XML::Element:0x3ff0918b132c name="a" attributes=[#<Nokogiri::XML::Attr:0x3ff0918b1250 name="href" value="/sport/tennis/2014/10/djokovic-through-wozniacki-out-china-open-2014101114115427766.html">, #<Nokogiri::XML::Attr:0x3ff0918b123c name="id" value="ctl00_ctl00_DataList1_ctl00_Thumbnail1_lnkImage10">, #<Nokogiri::XML::Attr:0x3ff0918b1228 name="target" value="_parent">] children=[#<Nokogiri::XML::Text:0x3ff0918a5b6c "\n  ">, #<Nokogiri::XML::Element:0x3ff0918a5360 name="img" attributes=[#<Nokogiri::XML::Attr:0x3ff0918a4d20 name="src" value="/mritems/imagecache/89/135/mritems/images/2014/10/1/2014101114447491734_20.jpg">, #<Nokogiri::XML::Attr:0x3ff0918a4cbc name="id" value="ctl00_ctl00_DataList1_ctl00_Thumbnail1_imgSmall10">, #<Nokogiri::XML::Attr:0x3ff0918a4b90 name="border" value="0">, #<Nokogiri::XML::Attr:0x3ff0918a4a28 name="class" value="imageThumbnail">]>, #<Nokogiri::XML::Text:0x3ff091871920 "\n   ">]> 

Если вы пытаетесь получить доступ к параметру "HREF", вместо того, с использованием inspect, использование:

puts doc.search('.w135 div.playerDiv a').map{ |n| n['href'] } 
# >> /sport/tennis/2014/10/djokovic-through-wozniacki-out-china-open-2014101114115427766.html