nokogiri从选定的div中刮掉所有的孩子

时间:2017-01-07 18:26:17

标签: html css ruby web nokogiri

我在空闲时间和Nokogiri一起玩,我担心我真的陷入困境。我正试图解决这个问题,因为今天早上(现在差不多8小时:()看起来我没有进展所有。在website我想要抓住页面上的所有线程。到目前为止,我意识到所有线程的父级都是

<div id="threads" class="extended-small">

每个线程由3个元素组成:

  1. 链接到图片
  2. div#title包含回复(R)和图像(I)的值
  3. div#teaser,包含主题的名称
  4. 我的问题是如何选择id ='threads'的子元素 并将每个孩子用3个元素推送到数组? 正如你在这段代码中看到的那样,我真的不知道自己在做什么,我非常非常感谢

    require 'httparty'
    require 'nokogiri'
    require 'json'
    require 'pry'
    require 'csv'
    
    page = HTTParty.get('https://boards.4chan.org/g/catalog')
    
    parse_page = Nokogiri::HTML(page)
    
    threads_array = []
    
    threads = parse_page.search('.//*[@id="threads"]/div') do |a|
        post_id = a.text
        post_pic = a.text
        post_title = a.text
        post_teaser = a.text
    threads_array.push(post_id,post_pic,post_title,post_teaser)
    end
    
    CSV.open('sample.csv','w') do |csv|
        csv << threads_array
    end
    
    Pry.start(binding)
    

    page and code

1 个答案:

答案 0 :(得分:3)

看起来原始HTML源代码不包含这些字段,这就是您在使用HTTParty和Nokogiri进行解析时没有看到的原因。看起来他们将数据放在JS变量中更远。试试这个:

require 'rubygems'
require 'httparty'
require 'json'

page = HTTParty.get('https://boards.4chan.org/g/catalog')
m = page.match(/var catalog = ({.*?});var/)
json_str = m.captures.first
catalog = JSON.parse(json_str)
pp catalog

这是否足够强大我会让你决定:)