我如何用Nokogiri打破元素

时间:2013-02-02 22:40:33

标签: ruby nokogiri

我需要什么

执行Nokogiri查询,添加一个换行符,这样当输出数据时它就不会聚集。

data = doc.css('div#specifications div#spec-area ul.product-spec')[0].text 

我试过了

data = doc.css('div#specifications div#spec-area ul.product-spec')[0].css('li').each{ |li| li.replace '\n' }.text 

我的完整代码

require 'Nokogiri'
require 'open-uri'
require 'spreadsheet'

doc = Nokogiri::HTML(open("http://www.asus.com/Notebooks_Ultrabooks/ASUS_TAICHI_21/#specifications"))

#Grab our product specifications - we only need the text not HTML
data = doc.css('div#specifications div#spec-area ul.product-spec')[0].text 

#Create the Spreadsheet
Spreadsheet.client_encoding = 'UTF-8'
book = Spreadsheet::Workbook.new

sheet1 = book.create_worksheet
sheet1.name = 'My First Worksheet'

#Output our data  to the Spreadsheet
sheet1[0,0] = data
book.write 'C:/Users/Barry/Desktop/output.xls'

2 个答案:

答案 0 :(得分:3)

您不想替换列表元素,只是想将它们映射到文本中,然后将它们连接在一起,用换行符分隔。

如果你抓住这个元素:

data = doc.css('div#specifications div#spec-area ul.product-spec li')

然后,您可以使用mapjoin获取由换行符分隔的所有列表元素的列表,如下所示:

lines = data.map(&:text).join("\n")

(来自评论)我以前从未使用过ruby电子表格,但这应该允许你输入数据:

data = doc.css('div#specifications div#spec-area ul.product-spec li')
data.each_with_index { |line, i| sheet1[i,0] = line.text }

希望有所帮助。

P.S。 require "nokogiri"中的“nokogiri”应全部小写。

答案 1 :(得分:0)

在每个li之后添加换行符:

ul = doc.at('div#specifications div#spec-area ul.product-spec')
ul.search('li').each{|li| li.after "\n"}
puts ul.text