我试图了解如何刮页 .
结果不会在视图页面上循环 . 它只显示第一个 . 为什么?
LinksController:
class LinksController < ApplicationController
def craigslist_scrape
require 'open-uri'
url = "https://losangeles.craigslist.org/search/web"
page = Nokogiri::HTML(open(url))
@craigslist_info = page.css("ul.rows")
@link_info = @craigslist_info.at_css("li.result-row p.result-info a.result-title.hdrlnk")
@date = @craigslist_info.at_css("li.result-row p.result-info time.result-date")
end
end
查看页面:craigslist_scrape.html.erb:
<% @craigslist_info.each do |craig| %>
<p><%= "Title of the job: #{@link_info.text}" %></p>
<p><%= "Date: #{@date.text}" %></p>
<% end %>
只有第一个结果的截图:
路线:
Rails.application.routes.draw do
root 'links#craigslist_scrape'
end
架构:
ActiveRecord::Schema.define(version: 20170308223314) do
enable_extension "plpgsql"
create_table "links", force: :cascade do |t|
t.string "link_info"
t.string "date"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
3 回答
你正在迭代
@craigslist_info
,但.css("ul.rows")
只会选择一个元素 . 每次调用.at_css
时,您也会覆盖以前的元素尝试类似的东西:
然后在你看来:
如果您想整理一下,您还可以使用更易于理解的形式对抓取的数据进行建模 . 例如:
然后迭代
@result_objects
,知道你可以为每一个访问.link
和.date
.这可能是因为你只是在抓第一页的结果 . 如果你去网址,你正在抓“https://losangeles.craigslist.org/search/web " you can see that it's only showing you the first 100 results. If you scroll down and click " next " the link changes to " https://losangeles.craigslist.org/search/web?s=100” . 如果要刮取所有结果,则需要创建一个方法来刮取结果的每个页面 .
在@craigslist_info的迭代中,您没有引用占位符,craig,而是仅引用@link_info和@date . 这只会产生一个结果 . 在迭代中,您希望访问“craig”的link_info和日期 .