2017-08-02 14 views
3

我在我的rails应用程序中使用nokogiri gem来获得一些html节点。我正在通过班级获得我的div。但是这个班名有时候会改变。例如,现在我得到它是这样的:Nokogiri - 通过正则表达式获取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 *”级,“原因有什么这两个元素的差异是‘X’级相同的其他类,因此另一个DIV。另一个是xa,xb;而我试图得到的这个是x13,x15。

+0

您可以不做'doc.css(“div.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1”)'(不含' x13'或'x15'),然后检查所选元素是否也有'x \ d \ d'类? – GolfWolf

+0

也许你可以用不受变化影响的选择器来定位div。你的标记是怎样的?为什么班级改变? _“x15可以是x13”_似乎有点任意。 – Stefan

+0

不能这样做,更新了问题。如果我删除了x *类,我还会得到另一个元素 –

回答

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,但我不知道是什么的XPath版本引入nokogiri支持。

1

你可以做到以下几点:

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}" }) 
1

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

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

注意:正则表达式可能不是你所期望的。另请注意:使用select可将您的NodeSet变成一个阵列