【问题标题】:Nokogiri - Get div with class by regexNokogiri - 通过正则表达式获取带有类的 div
【发布时间】:2017-08-06 06:24:07
【问题描述】:

我在我的 rails 应用程序上使用 nokogiri gem 来获取一些 html 节点。我正在按类获取我的 div。但是这个类名有时会改变。例如,现在我是这样理解的:

doc.css("div.t.m0.x15.h3.ff2.fs1.fc0.sc0.ls0.ws1")

例如,“x15”可以是“x13”。我可以这样做:

doc.css("div.t.m0.x13.h3.ff2.fs1.fc0.sc0.ls0.ws1", "div.t.m0.x15.h3.ff2.fs1.fc0.sc0.ls0.ws1")

这可行,但我认为设置一个范围会更好,比如 x13-x15,所以如果它是 x14,我不需要保持那么冗长。

关于如何做到这一点的任何提示?谢谢!

编辑:

我不能删除 "x*" 类,因为有另一个 div 具有相同的另一个类,所以这两个元素的区别在于 "x" 类。另一个是xa,xb;而我想要得到的是 x13, x15。

【问题讨论】:

  • 你能不能不做doc.css("div.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1")(没有x13或x15)然后检查所选元素是否也有x\d\d类?
  • 也许您可以使用不受更改影响的选择器来定位 div?你的标记看起来如何?为什么班级会变? "x15 can be x13" 似乎有点武断。
  • 不能那样做,更新了问题。如果我删除 x* 类,我会得到另一个元素
  • 我从来没有用过 Nokogiri 但你不能先用classes_to_select = ['.x15', '.x13'] 然后doc.css(*classes_to_select.map { |c| "div#{base_classes}#{c}" }) 吗?其中base_classes = '.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1'
  • @MrYoshiji 是的,那将是一个不错的选择。但是首先想知道是否有某种方法可以使用正则表达式来做到这一点。如果没有,我会接受你的回答!

标签: ruby-on-rails ruby nokogiri


【解决方案1】:

您可以为此目的使用.xpath 方法。例如

doc.xpath("//div[@class='x13' or @class='x15']")

或者你可以使用

//div[starts-with(@class, 'x') and (ends-with(@class, '13') or (ends-with(@class, '15'))]

XPath 2.0中出现了regexp搜索,但不知道nokogiri支持什么xpath版本。

【讨论】:

    【解决方案2】:

    如果你真的需要正则表达式,你会使用select:

    doc.css("div.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1").
      select{|div| div[:class][/x1[3-5]/]}
    

    注意:正则表达式可能无法达到您的预期。另请注意:使用 select 会将您的 NodeSet 转换为数组

    【讨论】:

      【解决方案3】:

      您可以执行以下操作:

      base_classes = '.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1'
      extra_classes = ['.x15', '.x13']
      doc.css(*extra_classes.map { |extra_class| "div#{base_classes}#{extra_class}" })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多