Ruby固有if结构

Ruby固有if结构,ruby,Ruby,我在做一个刮网器。页面的变体很少,程序在每个页面上的工作方式应该有所不同。我需要根据页面上的内容改变它处理页面的方式。如果s: if str=data.css('div#imgTag').to_s str.delete('@') #do something elsif str=data.css('span#Title').to_s #do something else elseif str=data.css('span#block').to_s #do something en

我在做一个刮网器。页面的变体很少,程序在每个页面上的工作方式应该有所不同。我需要根据页面上的内容改变它处理页面的方式。如果s:

if str=data.css('div#imgTag').to_s
  str.delete('@') 
  #do something
elsif str=data.css('span#Title').to_s
  #do something else
elseif str=data.css('span#block').to_s
  #do something
end

return str

但是上面的代码并不总是有效的。我认为有一个缺陷,我正在寻找一个更好的方法来解决它。我正在寻找更优雅的结构。

当时,您可以使用
案例,而不是
如果
,当您的几个ifs大约是同一个变量时,它更实用:

否则,我真的不知道你能做得更好。您应该添加更多关于程序上下文和不起作用的内容的详细信息

编辑:@Aetherus在注释中是正确的,您正在使用
=
而不是
=
进行比较,这将为您的变量赋值,而不是测试它,因此它总是正确的

再次编辑:@Stefan也有道理。如果
data.css()
返回nil,
to
将返回一个始终为真的空字符串。如果对nil对象()调用,可以使用
try(:to_s)
返回nil

您的代码变成:

case str
  when data.css('div#imgTag').try(:to_s)
    str.delete('@') 
    #do something
  when data.css('span#Title').try(:to_s)
    #do something else
  when data.css('span#block').try(:to_s)
    #do something
end

return str

时,您可以使用
案例,而不是
如果
,当您的几个ifs大约是同一个变量时,这更为实用:

否则,我真的不知道你能做得更好。您应该添加更多关于程序上下文和不起作用的内容的详细信息

编辑:@Aetherus在注释中是正确的,您正在使用
=
而不是
=
进行比较,这将为您的变量赋值,而不是测试它,因此它总是正确的

再次编辑:@Stefan也有道理。如果
data.css()
返回nil,
to
将返回一个始终为真的空字符串。如果对nil对象()调用,可以使用
try(:to_s)
返回nil

您的代码变成:

case str
  when data.css('div#imgTag').try(:to_s)
    str.delete('@') 
    #do something
  when data.css('span#Title').try(:to_s)
    #do something else
  when data.css('span#block').try(:to_s)
    #do something
end

return str

没有关键字
elseif
是您在此处键入错误吗?
str=…
str==…
to总是返回字符串,即真实值。因此,您的
elsif
永远无法到达。我想建议两件事。尝试Gem mechanize,然后使用Xpath获取确切的元素,并根据需要的数据条件使用switch case。这里没有关键字
elseif
是否键入错误?
str=…
str==…
to\u s
始终返回字符串,即真实值。因此,您的
elsif
永远无法到达。我想建议两件事。尝试Gem mechanize,然后使用Xpath获取确切的元素,并针对需要数据的条件使用开关案例。