我试图用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
答案 0 :(得分:1)
如果通过&#39; interval&#39;你的意思是当列表没有价格时打印的空行,你可以通过使puts
有条件来解决这个问题:
puts price unless price.empty?
如果我理解正确,您的hdrlnk
和price
条目就会彼此不同步。发生这种情况是因为您当前的循环正在跳过具有空白price
字段的条目并直接转到下一个字段。
解决此问题的最佳方法是找到包含price
和hdrlnk
的容器,然后分别对hdrlnk
和price
条目进行迭代。在此页面上将是.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;有点误导。我认为间隔是一种特殊的循环,它在指定的时间间隔运行,即每隔一分钟或每分钟。在这种情况下,使用loop
或iteration
这两个术语可能更为清晰。