当我没有确切的元素 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')