我正在开发一个从http://www.screener.in/获取HTML的应用程序。
我可以输入像“Atul Auto Ltd”这样的公司名称,然后从the next page提交, 抓取以下细节:“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页面中抓取特定的类。 第一个“CMP / BV”的XPath是:
//*[@id="top"]/div[3]/div/table/tbody/tr/td[11]
但它没有提供任何输出。
答案 0 :(得分:3)
使用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 分别是第12和第3列。现在我可以从数组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