Как очистить данные с помощью Mechanize и Nokogiri?

Я работаю над приложением, которое получает HTML-код с http://www.screener.in/.

Я могу ввести название компании, например «Atul Auto Ltd», и отправить его из на следующей странице соскребите следующие данные: "CMP/BV" и "CMP".

Я использую этот код:

require 'mechanize'
require 'rubygems'
require 'nokogiri'

Company_name='Atul Auto Ltd.'
agent = Mechanize.new
page = agent.get('http://www.screener.in/')
form = agent.page.forms[0]
print agent.page.forms[0].fields
agent.page.forms[0]["q"]=Company_name
button = agent.page.forms[0].button_with(:value => "Search Company")
pages=agent.submit(form, button)
puts pages.at('.//*[@id="top"]/div[3]/div/table/tbody/tr/td[11]')
# not getting any output.

Код ведет меня на нужную страницу, но я не знаю, как сделать запрос, чтобы получить необходимые данные.

Я пробовал разные вещи, но безуспешно.

Если возможно, может ли кто-нибудь указать мне на хороший учебник, в котором объясняется, как очистить определенный класс с HTML-страницы. XPath первого "CMP/BV":

//*[@id="top"]/div[3]/div/table/tbody/tr/td[11]

но это не дает никакого результата.


person Deepender Singla    schedule 20.07.2013    source источник


Ответы (1)


Используя Nokogiri, я бы сделал следующее:

Использование селекторов CSS

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://www.screener.in/company/?q=Atul+Auto+Ltd.'))

doc.class
# => Nokogiri::HTML::Document
doc.css('.table.draggable.table-striped.table-hover tr.strong td').class
# => Nokogiri::XML::NodeSet

row_data = doc.css('.table.draggable.table-striped.table-hover tr.strong td').map do |tdata|
  tdata.text
end

 #From the webpage I took the below value from the table 
 #*Peer Comparison Top 7 companies in the same business*    

row_data
# => ["6.",
#     "Atul Auto Ltd.",
#     "193.45",
#     "8.36",
#     "216.66",
#     "3.04",
#     "7.56",
#     "81.73",
#     "96.91",
#     "17.24",
#     "2.92"]

Глядя на таблицу с веб-страницы, я вижу, что CMP/BV и CMP — это двенадцатый и третий столбцы соответственно. Теперь я могу получить данные из массива row_data. Таким образом, CMP — это второй индекс, а CMP/BV — последнее значение массива row_data.

row_data[2] # => "193.45" #CMP
row_data.last # => "2.92" #CMP/BV

Использование XPATH

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://www.screener.in/company/?q=Atul+Auto+Ltd.'))

p doc.at_xpath("//*[@id='peers']/table/tbody/tr[6]/td[3]").text
p doc.at_xpath("//*[@id='peers']/table/tbody/tr[6]/td[10]").text
# >> "193.45" #CMP
# >> "17.24"  #CMP/BV
person Arup Rakshit    schedule 20.07.2013
comment
Это работает, можете ли вы сказать мне, как вы можете узнать селектор css? . Я проследил с помощью инструментов Chrome Developers, так что есть ли какие-либо инструменты для этого и как я могу это сделать с помощью xpath. - person Deepender Singla; 20.07.2013
comment
Я использую надстройку Firefox Firebug. - person Arup Rakshit; 20.07.2013
comment
любая идея, как это сделать с помощью xpath. - person Deepender Singla; 20.07.2013
comment
@DeependerSingla Используйте правила CSS... это всегда легко и приятно видеть. :) см. мое обновление. - person Arup Rakshit; 20.07.2013
comment
@okey все еще нет ничего плохого в попытке. - person Deepender Singla; 20.07.2013
comment
CSS не всегда самая простая форма селектора, но обычно их легче читать. Иногда приходится использовать XPath, потому что он более полнофункциональный. - person the Tin Man; 20.07.2013
comment
@theTinMan Да .. вы правы .. Но если есть возможность использовать селекторы CSS, я использую его там. Так как это более читабельно, чем xpath. - person Arup Rakshit; 20.07.2013
comment
@Priti Пожалуйста, не предлагайте вывод xpath_for как предложенный XPath. Он имеет тенденцию создавать нечитаемые выражения, потому что они являются буквальным переводом CSS, тогда как идиоматический XPath будет короче и чище. - person Mark Thomas; 21.07.2013
comment
@priti, не могли бы вы рассказать мне, как вы получили этот xpath? Я использую инструменты разработчика Google, я получаю этот xpath //*[@id=top]/div[3]/div/table/tbody/tr/td[10] это не дает никакого результата, и ваш xpath для того же //*[@id='peers']/table/tbody/tr[6]/td[10]. Я новичок в xpath и CSS, если вы можете помочь, каким образом мы можем получить путь xpath и CSS. - person Deepender Singla; 22.07.2013
comment
@DeependerSingla Я создал выражение xpath, выполнив просмотр источника на веб-странице. Тем не менее, я бы рекомендовал использовать селекторы CSS, так как вы только начали работать с Nokogiri. Как только вы познакомитесь с использованием селекторов CSS. Это постепенно поможет вам создать выражение xpath. Я хотел бы сказать вам, что вы должны изучить надстройку Firebug Firefox для того же. - person Arup Rakshit; 22.07.2013
comment
Mechanize включает Nokogiri, поэтому вы можете загрузить веб-сайт с помощью агента Mechanize, а затем выполнить: Nokogiri::HTML(website.body) для чтения. Почему стоит использовать «Механизм»? потому что вы можете сохранять сеансы, избегать robots.txt и других приятных вещей. - person José Castro; 18.12.2013