我的任务
从 http://www.asus.com/Notebooks_Ultrabooks/ASUS_TAICHI_21/#specifications 中提取所有规范并将其放入电子表格中(我们稍后会进行格式化)
问题
电子表格已创建,但我的输出返回空白。
我的代码
require 'Nokogiri'
require 'open-uri'
require 'spreadsheet'
doc = Nokogiri::HTML(open("http://www.asus.com/Notebooks_Ultrabooks/ASUS_TAICHI_21/#specifications"))
data = puts doc.css('//div#specifications/div#spec-area/ul#product-spec/li')
Spreadsheet.client_encoding = 'UTF-8'
book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet
sheet1.name = 'My First Worksheet'
sheet1[0,0] = data
book.write 'C:/Users/Barry/Desktop/output.xls'
以下代码对我有用
require 'Nokogiri'
require 'open-uri'
require 'spreadsheet'
doc = Nokogiri::HTML(open("http://www.asus.com/Notebooks_Ultrabooks/ASUS_TAICHI_21/#specifications"))
data = doc.css('div#specifications div#spec-area ul.product-spec')[0].text
Spreadsheet.client_encoding = 'UTF-8'
book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet
sheet1.name = 'My First Worksheet'
sheet1[0,0] = data
book.write 'C:/Users/Barry/Desktop/output.xls'
这里有几个问题:
-
看起来您正在尝试通过打印出行中
css
调用的结果来进行调试:data = puts doc.css('//div#specifications/div#spec-area/ul#product-spec/li')
该方法
puts
返回nil
,因此data
将被nil
,并且将导致不显示任何内容。 -
在你正在解析的页面中,
product-spec
列表实际上是一个类,而不是一个 id,所以你需要.product-spec
(.
而不是#
)。
你 使用的语法实际上不是CSS,看起来你混合了CSS和Xpath。你想要这样的东西:
doc.css('div#specifications div#spec-area ul.product-spec li')
(最后一点似乎并没有真正影响结果。Nokogiri 将 CSS 选择器转换为 xpath,并且似乎转换无论如何都会产生有效的 xpath)。