首页 文章

Nokogiri结果没有循环

提问于
浏览
0

我试图了解如何刮页 .

结果不会在视图页面上循环 . 它只显示第一个 . 为什么?

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

只有第一个结果的截图:

enter image description here

路线:

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

  • 0

    你正在迭代 @craigslist_info ,但 .css("ul.rows") 只会选择一个元素 . 每次调用 .at_css 时,您也会覆盖以前的元素

    尝试类似的东西:

    page = Nokogiri::HTML(open(url))
    @links = page.css("li.result-row p.result-info a.result-title.hdrlnk")
    @dates = page.css("li.result-row p.result-info time.result-date")
    

    然后在你看来:

    <% @links.each_with_index do |link, index| %>
      <p><%= "Title of the job: #{link.text}" %></p>
      <p><%= "Date: #{@dates[index].text}" %></p>
    <% end %>
    

    如果您想整理一下,您还可以使用更易于理解的形式对抓取的数据进行建模 . 例如:

    results = page.css("li.result-row p.result-info")
    @result_objects = results.map { |o|
                        OpenStruct.new(
                          link: o.at_css("a.result-title.hdrlnk"),
                          date: o.at_css("time.result-date")
                        )
                      }
    

    然后迭代 @result_objects ,知道你可以为每一个访问 .link.date .

  • 1

    这可能是因为你只是在抓第一页的结果 . 如果你去网址,你正在抓“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” . 如果要刮取所有结果,则需要创建一个方法来刮取结果的每个页面 .

  • 0

    在@craigslist_info的迭代中,您没有引用占位符,craig,而是仅引用@link_info和@date . 这只会产生一个结果 . 在迭代中,您希望访问“craig”的link_info和日期 .

    <% @craigslist_info.each do |craig| %>
        <% link_info = craig.at_css("li.result-row p.result-info a.result-title.hdrlnk") %> 
        <% date = craig.at_css("li.result-row p.result-info time.result-date")%>
        <p><%= "Title of the job: #{link_info.text}" %></p>
        <p><%= "Date: #{date.text}" %></p>
    <% end %>
    

相关问题