2013-02-13 106 views
0

我想知道如何从屏幕上获取信息以加入,以便最终可以将其放入CVS或数据库文件中。这只是一个例子,但是我选择测试的网站的实际数据。我测试了这些css调用以确保它们是有效的。提前感谢你的帮助。如何在Nokogiri HTML刮板中加入这些元素?

代码如下:

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

url = "http://neighbors.whitepages.com/search/neighbor_search/7707-Gralnick-Pl/Springfield,-VA" 
doc = Nokogiri::HTML(open(url)) 
puts doc.at_css("title").text 
doc.css(".header").each do |header| 
    address = header.css(".address").text 
    puts "#{address}" 
end 
doc.css(".household_members").each do |household_members| 
    names = household_members.css(".basic_info").text 
    puts "#{names}" 
end 
+1

加入他们如何?你想如何格式化数据? – 2013-02-13 04:25:58

+0

数据已分组为div,您只需遍历每个div。 – pguardiario 2013-02-13 05:05:55

+0

最初,我只是将地址放在一列中,并将名称与名称列中的名字对应起来。最终所有名称在单独的列中与地址最多4个,并继续逐行处理到一个cvs文件或表。 – 2013-02-13 05:12:45

回答

0

这将使您获得更可用格式的数据。它绕一圈含<div class="single">外,让地址更容易分组和人:

require 'nokogiri' 
require 'open-uri' 

url = "http://neighbors.whitepages.com/search/neighbor_search/7707-Gralnick-Pl/Springfield,-VA" 
doc = Nokogiri::HTML(open(url)) 
data = doc.search('div.single').map{ |div| 
    [ 
    div.at('.address').text, 
    div.search('.household_members > .basic_info').map{ |n| n.text.strip } 
    ] 
} 

看着data[0, 5]

[ 
    ["7705 Gralnick Pl", ["Debra A Mussmon"]], 
    ["7709 Gralnick Pl", ["Mary D Apker", "John E Apker"]], 
    ["7202 Caulking Pl", ["Vivianjune S Furber"]], 
    ["9246 Northedge Dr", ["Bridget Cox (703) 455-6057", "Joseph R Furber (703) 455-2442", "Vivian J Furber (703) 455-2442"]], 
    ["9244 Northedge Dr", ["David B Burlingame (703) 455-5708", "Linda J Burlingame (703) 455-5708", "Colby Burlingame (703) 455-5708"]] 
] 

没有任何暗示你的数据库架构其不可能给你任何帮助写作到你的数据库,但至少这给你一个出发点。迭代data数组数组,并为每个子数组存储地址,然后存储关联的名称。

如果您想对电话号码进行操作,您必须弄清楚如何使用正则表达式捕捉它们,但这是一个单独的问题。

+0

这非常有帮助。我已经解决了让数据进入数组,但是你的代码更加雄辩。谢谢。此时的模型将简单地捕获阵列,如您所示,完整地址和每个名称都是单独的字段。可能不得不“榨取”电话,因为在这一点上它们不是必需的。这将是一张带有其他表格链接的平板电脑桌。 – 2013-02-15 23:05:03

0

我将遍历div s的id =〜group_和/或classgroup

然后在每个div中提取地址和家庭成员。