извлечь одну строку из HTML, используя Ruby / Mechanize (и Nokogiri) - PullRequest
3 голосов
/ 22 января 2010

Я извлекаю данные с форума. Мой скрипт на основе работает нормально. Теперь мне нужно извлечь дату и время (21 декабря 2009, 20:39) из одного поста. Я не могу заставить это работать. Я использовал FireXPath для определения xpath.

Пример кода:

 require 'rubygems'
 require 'mechanize'

   post_agent = WWW::Mechanize.new
    post_page = post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')
    puts  post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()').to_s.strip
    puts  post_page.parser.at_xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()').to_s.strip
    puts post_page.parser.xpath('//[@id="post1960370"]/tbody/tr[1]/td/div[2]/text()')

все мои попытки заканчиваются пустой строкой или ошибкой.


Я не могу найти никакой документации по использованию Nokogiri в Mechanize. Документация по механизации в нижней части страницы гласит:

После того, как вы использовали Mechanize, чтобы перейти к странице, которую нужно очистить, затем очистите ее, используя методы Нокогири.

Но какими методами? Где я могу прочитать о них с примерами и объясненным синтаксисом? На сайте Nokogiri я тоже ничего не нашел.

Ответы [ 2 ]

27 голосов
/ 22 января 2010

Радек. Я собираюсь показать вам, как ловить рыбу.

Когда вы звоните Mechanize::Page::parser, он дает вам документ Нокогири. Таким образом, ваши звонки "xpath" и "at_xpath" вызывают Нокогири. Проблема в ваших путях. В общем, начните с самого общего xpath, который вы можете получить, а затем сузьте его. Так, например, вместо этого:

puts  post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()').to_s.strip

начать с этого:

puts post_page.parser.xpath('//table').to_html

Это получает любые таблицы, где угодно, а затем печатает их как HTML. Изучите HTML, чтобы увидеть, какие таблицы он вернул. Вероятно, он захватил несколько, когда вам нужен только один, поэтому вам нужно будет сказать ему, как выбрать тот стол, который вы хотите. Если, например, вы заметили, что у таблицы, которую вы хотите, есть класс CSS "userdata", попробуйте следующее:

puts post_page.parser.xpath("//table[@class='userdata']").to_html

Каждый раз, когда вы не получаете массив, вы вводите в заблуждение путь к xpath, поэтому исправьте его, прежде чем продолжить. Получив нужную таблицу, попробуйте получить строки:

puts post_page.parser.xpath("//table[@class='userdata']//tr").to_html

Если это сработало, снимите «to_html», и у вас теперь есть массив узлов Нокогири, каждый из которых представляет собой строку таблицы.

И вот как ты это делаешь.

6 голосов
/ 29 декабря 2010

Я думаю, что вы скопировали это из Firebug, firebug дает вам дополнительное тело, которого может не быть в реальном коде ... поэтому я предлагаю удалить это тело и попробовать снова если это все еще не работает ... тогда следуйте процессу Уэйна Конрада, который является лучшим!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...