如何避免与Mechanize的间隔

时间:2016-10-20 14:37:24

标签: ruby mechanize

我试图用Mechanize刮掉Craiglist。我编码:

require 'mechanize'

a = Mechanize.new
page = a.get("http://paris.craigslist.fr/search/apa")
i = 0
list_per_page = 99
while i <= list_per_page do
    title = page.search(".hdrlnk")[i].text
    price = page.search(".price")[i].text
    puts title
    puts price
    puts "-----------"
    i+=1
end

它有效但当列表没有任何价格时会有间隔。我认为这是因为我使用search()[i]但我不知道我必须做些什么来避免间隔。有什么想法吗?

编辑:
在Craiglist上有:

listing_title1 -> $100
listing_title2 -> $200
listing_title3 -> 
listing_title4 -> $60
listing_title5 -> $150

我的输出CSV显示:

listing_title1 -> $100
listing_title2 -> $200
listing_title3 -> $60
listing_title4 -> $150
listing_title5 -> $300

300美元是listing_title6

2 个答案:

答案 0 :(得分:1)

如果通过&#39; interval&#39;你的意思是当列表没有价格时打印的空行,你可以通过使puts有条件来解决这个问题:

puts price unless price.empty?

修改

如果我理解正确,您的hdrlnkprice条目就会彼此不同步。发生这种情况是因为您当前的循环正在跳过具有空白price字段的条目并直接转到下一个字段。

解决此问题的最佳方法是找到包含pricehdrlnk的容器,然后分别对hdrlnkprice条目进行迭代。在此页面上将是.row,其中包含每个搜索结果的所有信息。所以这样的事情会起作用:

page.search(".row").each do |row|
  title = row.search(".hdrlnk").first
  price = row.search(".price").first
  puts title.text if title
  puts price.text if price
  puts "------------"
end

答案 1 :(得分:0)

我知道你已经接受了答案,这很好,但我想介绍一下next的概念,这是一个比if <thing>检查更强大的解决方案结束了。

您的方法可能如下所示:

while <condition> do
  title = page.search(".hdrlnk")[i].text
  price = page.search(".price")[i].text

  # skip to the next iteration if any of the vars are nil
  next unless [title, price].all?

  # ... the rest of code
end

顺便说一下,我认为您使用了“时间间隔”这个术语&#39;有点误导。我认为间隔是一种特殊的循环,它在指定的时间间隔运行,即每隔一分钟或每分钟。在这种情况下,使用loopiteration这两个术语可能更为清晰。