我仍然很擅长编码,而且我正在尝试学习操纵CSV文件。
下面的代码打开指定的CSV文件,转到B列(header = url)中CSV文件中的每个网址,然后在网页上找到价格。
CSV文件中的示例数据:
Web site name (fairly obvious)
Webspace (no idea what this is)
我在将该价格写入相同CSV中的相邻列C(标头=价格)时遇到了麻烦。
Store,URL,Price
Walmart,http://www.walmart.com/ip/HP-11.6-Stream-Laptop-PC-with-Intel-Celeron-Processor-2GB-Memory-32GB-Hard-Drive-Windows-8.1-and-Microsoft-Office-365-Personal-1-yr-subscription/39073484
Walmart,http://www.walmart.com/ip/Nextbook-10.1-Intel-Quad-Core-2-In-1-Detachable-Windows-8.1-Tablet/39092206
Walmart,http://www.walmart.com/ip/Nextbook-10.1-Intel-Quad-Core-2-In-1-Detachable-Windows-8.1-Tablet/39092206
过去,我已经能够使用:
require 'nokogiri'
require 'open-uri'
require 'csv'
contents = CSV.open "mp_lookup.csv", headers: true, header_converters: :symbol
contents.each do |row|
row_url = row[:url]
goto_url = Nokogiri::HTML(open(row_url))
new_price = goto_url.css('meta[itemprop="price"]')[0]['content']
#----
#In this section, I'm looking to write the value of new_price to the 3rd column in the same CSV file
#----
end
但在这种情况下,这似乎不起作用。
感谢任何帮助!
答案 0 :(得分:0)
简单的答案是,您可以参考CSV文件中的:price
列,就像您引用:url
列一样。尝试使用此代码在内存中的CSV对象中设置价格:
row[:price] = new_price
在您阅读完所有记录后,您将要再次保存CSV文件。您可以将其保存为任何文件名,但我们只是覆盖此示例中的上一个文件:
CSV.open("mp_lookup.csv", "wb") do |csv|
contents.each do |row|
csv << row
end
end
在真实的生产环境中,您希望比此更具容错能力,并保留原始文件,直到流程结束。但是,这显示了如何更新每行的价格列中的值,然后将更改保存到文件中。