正则表达式以选择 id



当我没有确切的元素 id 但知道一般格式时,有没有办法使用正则表达式或"like"函数?

目前我有

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

但我想找到任何 id 像 XYZ_basic 这样的表,甚至任何像 _basic 这样的表都可以工作。

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

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源代码将显示它们,但通常我们不会将它们包含在任何类型的搜索中,因为它们不会在源代码中找到。

您可以使用

xpath 函数contains来检查 id 属性是否包含子字符串 "_basic":

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

注意:

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

如果你真的需要如此精确,你可以通过模拟 xpath 2.0 函数来解决这个问题,ends-with如下所示:

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

相关内容

  • 没有找到相关文章

最新更新