0

我正在使用 Nokogiri 从 Craigslist 中抓取数据。

这部分应该从每一行刮掉价格,但是它会刮掉每个价格两次,所以在我刮掉的数据中我得到:

@listings = [["item1", "price1"], ["item2", "price1"]]

@doc.css('.row').each do |row|
    if /\$[0-9]+/.match(row.text)
      @doc.css('.price').each do |price|
        debugger
          @listings[i] << price.text.delete('$')
          i += 1
          next
      end
    else
      @listings[i] << "n/a"
      i += 1
    end
  end   
4

1 回答 1

1
@doc.css('.row').each do |row|
  ...
  @doc.css('.price').each do |price|

是错的。每次您的代码循环时,row您都将返回class="price"整个文档中第一次出现的标签。

相反,它应该是这样的:

@doc.css('.row').each do |row|
  ...
  row.css('.price').each do |price|

此外,这是将节点聚合到容器中的错误方法:

@listings[i] << price.text.delete('$')
i += 1

相反,@listings应该定义为一个数组,然后推入它:

@listings << price.text.delete('$')

由于您没有显示初始化的位置i,或者listings,您必须弄清楚如何使其工作。而且,事实上,您正在做一些真正有问题的事情,至少在您提供给我们的不完整代码示例中。

于 2013-11-12T02:10:59.627 回答