正则表达式选择id

时间:2014-11-13 22:08:27

标签: ruby regex nokogiri

当我没有确切的元素ID时,有没有办法使用正则表达式或“喜欢”函数,但是知道一般格式?

目前我有

doc.css('table[id="UTA_basic"]//tbody')

但我想查找任何ID为XYZ_basic的表格,甚至任何像_basic这样的表都可以使用。

如果需要,我愿意切换到xpath。

2 个答案:

答案 0 :(得分:2)

Nokogiri支持为CSS和XPath选择器创建自己的标记匹配器的能力。

css

  

也可以定义自定义CSS伪类。要定义自定义伪类,请创建一个类并实现要定义的自定义伪类。该方法的第一个参数将是当前匹配的NodeSet。任何其他参数都是您传入的参数。例如:

node.css('title:regex("\w+")', Class.new {
  def regex node_set, regex
    node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ }
  end
}.new)

同样,对于xpath

  

也可以定义自定义XPath函数。要定义自定义函数,请创建一个类并实现要定义的函数。该方法的第一个参数将是当前匹配的NodeSet。任何其他参数都是您传入的参数。请注意,此类可能出现在参数列表中的任何位置。例如:

node.xpath('.//title[regex(., "\w+")]', Class.new {
  def regex node_set, regex
    node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ }
  end
}.new)

这种能力看起来像是让你深入了解标签和参数,但我还没有玩过它来看看它有多大帮助。

关于doc.css('table[id="UTA_basic"]//tbody')。这看起来不像一个CSS,但看起来像一个XPath表达式,并将其传递给css将混淆Nokogiri。此外,请确保您正在解析的HTML实际上具有tbody标记。生成表的人很少使用它们,但浏览器喜欢在解析HTML时将它们放入。在浏览器中查看HTML源代码会显示它们,但通常我们不会将它们包含在任何类型的搜索中,因为它们无法在源代码中找到。

答案 1 :(得分:1)

您可以使用xpath函数contains来检查id属性是否包含子字符串“_basic”:

doc.xpath('//table[contains(@id, "_basic")]/tbody')

注意:

但是,如果这种方式存在于包含类似_basical _basic_1的ID的文档表标记中,则这种方式可能会给您误报,因为此函数不会检查位置或字符后,但只存在子串。

如果您确实需要如此精确,可以通过模拟xpath 2.0函数ends-with来解决此问题:

doc.xpath('//table[substring(@id,string-length(@id)-string-length("_basic")+1)="_basic")]/tbody')