用nokogiri抓取网址

时间:2014-10-15 09:49:40

标签: html ruby web nokogiri screen-scraping

我正试图从网站上获取一些信息,我有一个我为几个不同的网站编写和编辑的脚本,但这个特别令我感到悲伤!

脚本读取类别并构建一个或多个要打开的页面,然后继续打开每个页面,然后它应该从每个类别页面上的每个产品中获取信息。构建阵列的功能仍然可以正常工作,看起来这个网站上的标记是如此不同,它的反应也不同。

我需要阅读此标记

<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>

我的剧本;

每个产品都在<li>标记

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

我可以用

取出产品名称
product.css('.product-title').text.strip

然后通常抓住产品URL我会定义URL所在的标签并使用类似的东西来获取href和gsub的内容以摆脱换行

product.css('.product-title')[:href].gsub(/\n/,"")

在这种情况下,我正在

./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>

如何阅读href?当它通常适用于不同的网站时,我无法解决为什么它会抛出这个错误。

1 个答案:

答案 0 :(得分:1)

product.css('.product-title')返回NodeSet,类似于数组。

使用first[0]获取第一个元素:

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

输出:

http://www.DOMAIN/producturl