2013-03-23 2 views
0

Это ссылка на фактический HTML:Как я могу достичь этого набора тегов TR?

doc = Nokogiri::HTML(open('https://www.google.com/finance?q=NYSE%3AAA&fstype=iii')) 

И приблизительная HTML фрагмент:

<div id="incannualdiv"> 
    <table id="fs-table"> 
    <tbody> 
     <tr>..</tr> 
     ... 
     <tr> 
     <td>Net Income</td> 
     <td>100</td> 
     </tr> 
     <tr>..</tr> 
    </tbody> 
    </table> 
</div> 

Эти детали я работаю с:

doc = Nokogiri::HTML(open('https://www.google.com/finance?q=NYSE%3AAA&fstype=iii')) 
div = doc.at "div[@id='incannualdiv']" #div containing the table i want 
table = div.at 'table' #table containing tbody i want 
tbody = table.at 'tbody' #tbody containing tr's I want 
trs = tbody.at 'tr' #SHOULD be all tr's of that table/tbody - but it's only the first TR? 

Я ожидаю этот последний бит, чтобы дать мне ВСЕ теги <TR>, которые будут включать в себя <TD>, который я ищу, но на самом деле это только дает мне первый <TR>.

Вот следующая часть:

irb(main):023:0> a = nil 
=> nil 
irb(main):024:0> doc.css('#incannualdiv > #fs-table tr').each { |e| if e.text.include? "Net Income\n"; a = e.text; end} 
=> 0 
irb(main):025:0> a 
=> "Net Income\n\n191.00\n611.00\n254.00\n-1,151.00\n" 
irb(main):026:0> a.split"\n" 
=> ["Net Income", "", "191.00", "611.00", "254.00", "-1,151.00"] 
+0

Было бы полезно, если вы также обновили свой образец HTML. «Чистый доход \ n \ n191.00 \ n611.00 \ n254.00 \ n-1,151.00 \ n" в нем не отражен. – mraaroncruz

+1

Nevermind, я просто пошел по ссылке. Вам нужен только «чистый доход», а не другой «чистый доход ...»? – mraaroncruz

+0

Да, точно, вы поняли. извините за дерьмовый образец html, но настоящий html ... хорошо ... сложный. + 1 за помощь ;-) – Ramy

ответ

2

Это должно сделать это.

doc.css('#incannualdiv > #fs-table tr') 

at_css (и я предполагаю at) возвращает один элемент, где css возвращает все соответствия.

Edit: Ответ на комментарий OP в

Вы можете получить текст в tr, который на самом деле текст в своих детях td сек с помощью метода text

trs = doc.css('#incannualdiv > #fs-table tr') 
# Get column labels from table headers 
labels = trs.first.css('th')[1..-1].map(&:text) 
net_income_tr = trs.detect { |tr| 
    tr.css('td').any? { |td| td.text.strip =~ /^Net Income$/ } 
} 
# drop first tr that just has Net Income text 
# I gave up on error checking. Exercise left to reader ;) 
# this will give you an array of floats for your Net Income columns 
net_income_columns = net_income_tr.css('td')[1..-1].map { |td| td.text.gsub(',','_').to_f } 

labeled_values = net_income_columns.each_with_index.map { |value, i| { label: labels[i].strip, value: value } } 
+0

ugh, извините, что вам это нужно, но здесь есть еще кое-что - мне нужно получить определенный набор TD внутри одного из TR, возвращенных сюда. Этот набор TD идентифицируется текстом первого TD, равным «Чистый доход» – Ramy

+0

. Я знаю, что это немного меняет вопрос, но я продолжаю получать это близко и не могу понять следующий шаг. – Ramy

+0

Я добавил обновление, чтобы ответить на ваш комментарий. Я думаю, что все правильно. – mraaroncruz

Смежные вопросы