当我没有确切的元素ID时,有没有办法使用正则表达式或“喜欢”函数,但是知道一般格式?
目前我有
doc.css('table[id="UTA_basic"]//tbody')
但我想查找任何ID为XYZ_basic
的表格,甚至任何像_basic
这样的表都可以使用。
如果需要,我愿意切换到xpath。
答案 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')