我如何通过机械化和引入nokogiri刮数据?(How do I scrape data throu

2019-10-18 09:38发布

我的工作在它得到来自HTML应用程序http://www.screener.in/ 。

我可以进入公司的名称,如“阿图尔汽车有限公司”,并提交它,并从下一个页面 ,刮去以下细节:“CMP / BV”和“议定书”。

我使用此代码:

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]

但它不提供任何输出。

Answer 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 / BVCMP分别为第十二和第三列。 现在,我可以从阵列中的数据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


文章来源: How do I scrape data through Mechanize and Nokogiri?