Использование Ruby / Mechanize для выбора следующего элемента после выбранного элемента - PullRequest
3 голосов
/ 21 ноября 2011

Мне не удалось найти этот вопрос конкретно, надеюсь, я не ошибаюсь, что это новый вариант более старого вопроса.

Я надеюсь, что смогу выбрать таблицу после (несовместимого) элемента p.red text (), где 'p' не содержит текст «Алфавитный», но содержит текст «ОБЩИЙ»

DOM выглядит примерно так:

<p class=red>Some Text</p>
  <table class="newclass">
  <tr></tr>
  <tr></tr>
</table>

<p class=red>Some Text</p>
<table class="newclass">
  <tr></tr>
  <tr></tr>
</table>

<p class=red>OVERALL</p>
<table class="newclass">
  <tr></tr>
  <tr></tr>
</table>
  • таблица приходит с разным количеством для каждой страницы.

Я хочу получить текст этого тега p (), а также получить таблицу сразу после нее. Опять же, где text () содержит "OVERALL", но не "ALPHABETICAL" .. я должен построить массив и .reject () элементы без совпадений? Я не уверен в данный момент, и я довольно новичок в использовании Ruby и Mechanize, заранее спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Использование CSS оценки Нокогири - это красиво и чисто:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<p class=red>Some Text</p>
  <table class="newclass">
  <tr></tr>
  <tr></tr>
</table>

<p class=red>Some Text</p>
<table class="newclass">
  <tr></tr>
  <tr></tr>
</table>

<p class=red>OVERALL</p>
<table class="newclass">
  <tr></tr>
  <tr></tr>
</table>
EOT

puts doc.at('p:contains("OVERALL")').to_html
# >> <p class="red">OVERALL</p>

puts doc.at('p:contains("OVERALL") ~ table').to_html
# >> <table class="newclass">
# >> <tr></tr>
# >> <tr></tr>
# >> </table>
1 голос
/ 21 ноября 2011

Тег p:

agent.parser.xpath('//p[.="OVERALL"]')[0]

таблица после него:

agent.parser.xpath('//p[.="OVERALL"]')[0].next.next

или

agent.parser.xpath('//p[.="OVERALL"]/following-sibling::table[1]')[0]
...