具有X个单元格的表行的CSS选择器

时间:2012-05-28 19:07:17

标签: ruby css-selectors nokogiri

我正试图从网站上删除一些内容,但我在选择正确的元素方面遇到了麻烦。

我正在使用Nokogiri,而且,因为我最了解CSS,我试图用它来选择我想要的数据。

有一个我不想要的行的大表,但这些可以改变;例如,它们并不总是第4,5,6,10,14行。

我可以判断它是否是我想要的行的唯一方法是该行中是否有TD个标记。 什么是正确的CSS选择器来做到这一点?

 # Search for nodes by css
  doc.css('#mainContent p table tr').each do |td|
  throw td
  end

编辑:

我正在试图抓住boxrec.com/schedule.php。我想要每个匹配的行,但是,它是一个非常大的表,有许多行不匹配。不需要每个日期部分的前几行,包括“bout可能会发生变化......”的所有其他行,以及在天之间间隔行。

解决方案:

doc.xpath("//table[@align='center'][not(@id) and not(@class)]/tr").each do |trow|

    #Try get the date
    if trow.css('.show_left b').length == 1
      match_date = trow.css('.show_left b').first.content

    end

    if trow.css('td a').length == 2 and trow.css('* > td').length > 10

      first_boxer_td = trow.css('td:nth-child(5)').first
      second_boxer_td = trow.css('td:nth-child(5)').first

      match = {
        :round => trow.css('td:nth-child(3)').first.content.to_i,
        :weight => trow.css('td:nth-child(4)').first.content.to_s,
        :first_boxer_name => first_boxer_td.css('a').first.content.to_s,
        :first_boxer_link => first_boxer_td.css('a').first.attribute('href').to_s,
        :second_boxer_name => second_boxer_td.css('a').first.content.to_s,
        :second_boxer_link => second_boxer_td.css('a').first.attribute('href').to_s,
        :date => Time.parse(match_date)
      }  


      #:Weight => trow.css('td:nth-child(4)').to_s
      #:BoxerA => trow.css('td:nth-child(5)').to_s
      #:BoxerB => trow.css('td:nth-child(9)').to_s    

      myscrape.push(match)

    end
  end

2 个答案:

答案 0 :(得分:1)

您将无法告诉 td包含的 tr元素数量,但您可以判断它是否为空:

doc.css('#mainContent p table tr:not(:empty)').each do |td|
  throw td
end

答案 1 :(得分:0)

您可以这样做:

带有第4个td

的行
doc.xpath('//tr/td[4]/..')

使用css的另一种方式:

doc.css('tr').select{|tr| tr.css('td').length >= 4}