Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 鲁比·诺科吉。匹配动态属性名称_Ruby_Xpath_Nokogiri_Dry - Fatal编程技术网

Ruby 鲁比·诺科吉。匹配动态属性名称

Ruby 鲁比·诺科吉。匹配动态属性名称,ruby,xpath,nokogiri,dry,Ruby,Xpath,Nokogiri,Dry,我正在尝试使用Nokogiri提取图像url。 下面的代码可以工作,但我希望以一种更高效、更可扩展的方式来做,而不是无限地做elsif if doc.at_css("img[itemprop='image']")['src'] img = doc.at_css("img[itemprop='image']")['src'] elsif doc.at_css("img[itemprop='image']")['data-src'] img = doc.at_css("img[ite

我正在尝试使用Nokogiri提取图像url。 下面的代码可以工作,但我希望以一种更高效、更可扩展的方式来做,而不是无限地做elsif

if doc.at_css("img[itemprop='image']")['src']
    img = doc.at_css("img[itemprop='image']")['src']
elsif doc.at_css("img[itemprop='image']")['data-src']
    img = doc.at_css("img[itemprop='image']")['data-src']
elsif doc.at_css("img[itemprop='image']")['data-react-src']
    img = doc.at_css("img[itemprop='image']")['data-react-src']
...
我想学习两种方法:

'src' || 'data-src' || 'data-react-src
1) 普通Ruby方式:像迭代属性名一样,
['src'、'data src'、'data react src'等…]

2) Nokogiri正则表达式或xpath,方法:

'src' || 'data-src' || 'data-react-src
像这样:

doc.at_css(“img[itemprop='image'])['src'| | |'data src'| |'data resact src]

更好的方法是将属性名称存储在变量中:

my_attributes = ['src' || 'data-src' || 'data-react-src]

doc.at_css("img[itemprop='image']").[my_attributes]
3) 如果有比以前更有效的方法,请尝试以下方法:

attributes = %w[src data-src data-react-src]
elem = doc.at_css("img[itemprop='image']")
attr = attributes.find { |attr| elem[attr] }
doc[attr] if attr
它的作用:

  • 保存静态和动态属性的列表。在将来添加更多。列表的顺序很重要[ref#3]
  • elem
    保存元素(
    Nokogiri::XML::element
    )。我们不想多次获取它以进行优化
  • attr
    保存元素响应的第一个属性。如果找到了
    src
    ,它将不会尝试在
    数据src
    中查找,以此类推。这样我们优化了迭代
  • 如果属性可用,则返回
    attr
    ibute处的值 希望能有帮助