我正在尝试从网站上抓取一些内容,但在选择正确的元素时遇到问题。
我正在使用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
你无法知道一个tr
包含多少个td
元素,但你可以判断它是否为空:
doc.css('#mainContent p table tr:not(:empty)').each do |td|
throw td
end
你可以做这样的事情:
TR 行,第 4 个 TD
doc.xpath('//tr/td[4]/..')
CSS 的另一种方式:
doc.css('tr').select{|tr| tr.css('td').length >= 4}