关于以下代码:
更新:
(感谢DGM和The Tin Man对代码的建议和标题的解释。)
#################
# get main page
#################
rows = doc.xpath('//table[@class="articulos"]/tr[td[5]/p/b]')
i = 0
details = rows.each do |row|
detail = {}
[
[:sku, 'td[3]/text()'],
[:desc, 'td[4]/text()'],
[:stock, "td[5]/p[@title]"],
[:price, 'td[6]/text()']
].each do |name, xpath|
detail[name] = row.at_xpath(xpath).to_s.strip
end
i = i + 1
if detail[:sku] != ""
price = detail[:price].split
if price[1] == "D"
currency = 144
else
currency = 168
end
stock = detail[:stock].gsub(/[^d]/, '')
cost = price[0].gsub(",", "").to_f
end
- 第一个
i = 0
、i = i + 1
是否必要 - 这使用了什么语法?
details = rows.each do |row|
- 为什么要使用
detail = {}
?这是在干什么 - 我确实理解
.each do |name,xpath|
,因为它的顺序是:name
,xpath
- 我猜
detail[name] = row.at_xpath(xpath).to_s.strip
的意思是,如果我调用detail[:sku]
,它将使xpath
处的那一行成为字符串条
对于我所理解的,在阅读了Ruby Poignant Book之后,阅读了我上面写的代码,我也许可以翻译成Ruby逻辑单词?。如果这不是对Ruby专家的侮辱,哈哈。
首先,我们有一个方法的循环,在另一个方法中有一个数组。
variable = variable.method block |block argument|
variable = {block}
[ array of arrays
[ symbol_1, 'string'],
[ symbol_2, 'string'],
[ symbol_3, 'string'],
[ symbol_4, 'string'],
[ symbol_5, 'string'],
[ symbol_6, 'string']
].method block |symbol, string|
variable[symbol] = variable.method(method argument).method.kernel_method
end block
end block
这是正确的吗?现在我需要解释一下,使用代码中的方法、变量和参数的实际名称,可以看到:
rows变量获取一个collect消息,以收集包含符号和xpath的数组中的一行,并且对于每个数组块,该行和xpath将应用内核方法条?
第一个i=0,i=i+1(为什么这里的必需品?)
没用,你是对的
details=rows.collect do|row|what这是语法吗?阵列?还是怎样类正在使用nokogiri?做野村与此事有任何关系还是仅仅是RUBY在处理一个对象。
它是纯粹的ruby风格,它循环应该是数组的元素。
它还重新创建存储在details
中的数组,该数组包含循环结束时声明的每个元素。这是detail
detail={}您可以看到这一点。为什么你想用这个吗?这个行吗我不是在做什么?
它将detail
初始化为空散列,然后在collect
循环中填充该散列。
我确实理解|name,xpath|因为顶部在order in name,xpath detail[名称]=row.at_xpath(xpath).to_strip我想这是说如果我打电话detail[:sku]它会在把xpath转换成字符串?
正确。
地图做什么?有语法吗在nokogiri页面上的教程?
map
循环应该是Hash的所有元素。它创建一个包含链接的数组。由于uniq!
,从该阵列中删除了重复的链路
注意这个函数末尾的bang,这意味着它改变了对象。
为什么他必须重复所有数据在#walk-through分页器中只是使用idk某个变量?
不理解这个问题。
细节<lt;细节我知道这叫做推一下?那为什么有人想推一些相同的名字哈哈。。。
这是一个推送,但它是details << detail
,所以逻辑是安全的。
总之,这不是一个漂亮的代码,但它似乎是功能性的:)
需要注意的是,我最近在自己的代码中做到了这一点:
detail = {}
[
[:sku, 'td[3]/text()'],
[:desc, 'td[4]/text()'],
[:qty, 'td[5]/text()'],
[:qty2, 'td[5]/p/b/text()'],
[:title, 'td[5]/p/@title'],
[:price, 'td[6]/text()']
].collect do |name, xpath|
detail[name] = row.at_xpath(xpath).to_s.strip
end
collect语句的结果被抛出,而将内容填充到detail
中的副作用是主要关注的问题。在这种情况下,collect可以更改为each。
detail = {}
[
[:sku, 'td[3]/text()'],
[:desc, 'td[4]/text()'],
[:qty, 'td[5]/text()'],
[:qty2, 'td[5]/p/b/text()'],
[:title, 'td[5]/p/@title'],
[:price, 'td[6]/text()']
].each do |name, xpath|
detail[name] = row.at_xpath(xpath).to_s.strip
end