2015-06-11 2 views
1

Я пытаюсь разобрать следующий HTML с помощью Ruby, и Nokogiri:Синтаксический HTML документ

<div class="vevent"> 
<table width="750"><tr> 
<td width="25"> </td> 
<td valign="top" width="200"> 
<font size="2" face="sans-serif"> 
<font color="black"><b>June 30, 2015</b></font> 
<br> 
<span class="dtstart"><span class="value-title" title="2015-06-30"></span></span><br><span class="summary"><font color="#92161" size="3"><b>Band Concert</b></font></span> 
<br><font color="#333333">Event</font><br> 
<br> 
<br> 
<br clear="left">Have a question? email us.<br> 
<br></font> 
</td> 
<td valign="top" width="10"></td> 
<td valign="top"> 
<br clear="left"><font color="#92161">111 Main Street</font><br> 
<font color="#92161">Mainstreet, Ohio 55111</font> 
<a rel="nofollow" href="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=%221700+111+MainStreet+NE+Mainstreet,+Ohio+55111%22" target="_blank"><font size="1" face="sans-serif">map link</font></a><br><br> 
<font color="#92161"><font size="2" face="sans-serif">Telephone:</font> 3305551000</font><br><br> 
Visit our website for complete information.<br><br> 
Enjoy a summer evening concert on Main Street at 8pm. Doors and cash bar open at 7pm.<br><br>Look for more details and ticket sales to be released soon on our website<br> <br><br> 
<br> 
</td> 
</tr></table> 
</div> 

Я пытаюсь захватить последний бит текста:

Visit our website for complete information.<br><br> 
Enjoy a summer evening concert on Main Street at 8pm. Doors and cash bar open at 7pm.<br><br>Look for more details and ticket sales to be released soon on our website<br> <br><br> 

Вот мой код до сих пор :

events = doc.css("div.vevent") 
events.collect do |row| 
    row.css("td")[3] 
end 

Это получит меня к третьему тд, который имеет текст, который я ищу следующим образом:

<td valign="top"> 
<br clear="left"><font color="#92161">111 Main Street</font><br> 
<font color="#92161">Mainstreet, Ohio 55111</font> 
<a rel="nofollow" href="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=%221700+111+MainStreet+NE+Mainstreet,+Ohio+55111%22" target="_blank"><font size="1" face="sans-serif">map link</font></a><br><br> 
<font color="#92161"><font size="2" face="sans-serif">Telephone:</font> 3305551000</font><br><br> 
Visit our website for complete information.<br><br> 
Enjoy a summer evening concert on Main Street at 8pm. Doors and cash bar open at 7pm.<br><br>Look for more details and ticket sales to be released soon on our website<br> <br><br> 
<br> 
</td> 

Однако однажды, если я позвоню text на этом td, я получу весь текст внутри td. Мне нужен только последний бит, который не находится внутри какого-либо элемента. Я попытался использовать XPath и parent, чтобы я мог сказать «просто дайте мне текст, который находится внутри td (не вложен внутри другого элемента)», но я не мог заставить это работать. У кого-нибудь есть идеи по этому поводу?

ответ

1

Попробуйте это код: doc.css('td')[3].css('> text()').to_s.strip

+0

Не выкидывать код. Объясните * почему * OP захочет использовать его. Предоставление небольшого количества кода эквивалентно передаче им рыбы. Объяснение это эквивалентно объяснению того, как ловить рыбу. Позднее это гораздо более полезно в долгосрочной перспективе. –

+0

Это был правильный ответ. Часть о ('> text()'), которая указывает только текст внутри td (а не вложенные элементы), - это то, что мне нужно. Я немного обновил его. Вместо doc я использовал строку, так как я повторяю кучу записей. Спасибо за помощь. –

+0

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

0

Я предлагаю использовать xpath, который является более гибким. Если я вас правильно понимаю, вы хотели бы:

Я хочу только последний бит, который не внутри любого элемента

Итак, попробуйте этот XPath:

//table//td[last()]/text() 
Смежные вопросы