Nokogiri - 通过正则表达式获取 div 和 class
Nokogiri - Get div with class by regex
我在我的 rails 应用程序上使用 nokogiri gem 来获取一些 html 节点。我通过它的 class 得到我的 div。但是那个 class 名字有时会改变。例如,现在我是这样得到的:
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*" class,因为还有另一个 div 与另一个 class 相同,所以这两个元素有什么区别"x"class。另一个是xa,xb;我想得到的这个是 x13,x15。
您可以为此目的使用 .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出现了正则搜索,不知道nokogiri支持什么xpath版本
您可以执行以下操作:
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}" })
如果你真的需要正则表达式,你可以使用 select
:
doc.css("div.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1").
select{|div| div[:class][/x1[3-5]/]}
注意:正则表达式可能无法达到您的预期。另请注意:使用 select
将您的 NodeSet 变成 Array
我在我的 rails 应用程序上使用 nokogiri gem 来获取一些 html 节点。我通过它的 class 得到我的 div。但是那个 class 名字有时会改变。例如,现在我是这样得到的:
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*" class,因为还有另一个 div 与另一个 class 相同,所以这两个元素有什么区别"x"class。另一个是xa,xb;我想得到的这个是 x13,x15。
您可以为此目的使用 .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出现了正则搜索,不知道nokogiri支持什么xpath版本
您可以执行以下操作:
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}" })
如果你真的需要正则表达式,你可以使用 select
:
doc.css("div.t.m0.h3.ff2.fs1.fc0.sc0.ls0.ws1").
select{|div| div[:class][/x1[3-5]/]}
注意:正则表达式可能无法达到您的预期。另请注意:使用 select
将您的 NodeSet 变成 Array