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

Ruby 具有X个单元格数的表行的CSS选择器,ruby,css-selectors,nokogiri,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

我试图从一个网站上刮下一些内容,但在选择正确的元素时遇到了困难

我正在使用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

编辑:

我在努力刮。我想要每个匹配的行,但是,这是一个非常大的表,有许多行不是匹配的。每个日期部分的前几行是不需要的,包括每隔一行有“bout subject to change…”的内容,以及日期之间的行距

解决方案:

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
您无法判断一个
tr
包含多少
td
元素,但您可以判断它是否为空:

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

您可以这样做:

tr第四个td的行

doc.xpath('//tr/td[4]/..')
css的另一种方式:

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

如果你想得到好的答案,你需要提供你正在抓取的页面,或者至少提供一些html示例。另外,最好的尝试方法是在
irb
会话中,您可以立即看到要扫描的元素,并不断调整选择器,直到找到所需内容。使用网站更新以进行刮取。我不知道irb是什么。。(交互式ruby会话?来自谷歌..设置容易吗?)ruby中包含IRB。试着在终端命令行中键入
irb
。这样做可能会更好、更容易。对于每个tr。。。。然后计算它的td,如果有所需的数字“Domore stuff”
doc.css
返回一个
NodeSet
,它的作用类似于
数组。将其分配给变量,然后对其使用
size
,将返回找到的元素数。从那里很容易添加条件逻辑。这帮助我找到了解决方案,因此我标记为正确!