Ruby Mechanize如何仅选择后续兄弟节点中的首个ul节点?
解决Mechanize中精准选择第一个
- 节点的最优方案
嘿,我来帮你搞定这个Mechanize节点选择的问题~你之前的思路没问题,但确实存在性能浪费的情况,因为div ~ ul会把
之后所有同级的
- 都捞出来再取第一个,页面里
- 多的话确实不划算。这里有几个更精准高效的方案:
方案1:用CSS伪类:first-of-type直接定位
这是最简洁的方式,直接通过CSS选择器锁定
之后的第一个方案2:用
- 兄弟节点,不用先拿所有
- 再筛选:
page.at('div ~ ul:first-of-type li').inner_html
:first-of-type会直接匹配符合条件的第一个节点,避免了多余的节点遍历,性能拉满。
方案2:用:nth-of-type(1)实现同样效果
和上面的逻辑一致,只是语法换了种写法,同样精准定位第一个后续
- :
page.at('div ~ ul:nth-of-type(1) li').inner_html
方案3:用XPath表达式精准路径匹配
如果你更熟悉XPath,也可以直接写定向路径,明确只取
的第一个
- 兄弟:
page.at('//div/following-sibling::ul[1]/li').inner_html
这里following-sibling::ul[1]的意思就是“取当前节点之后的第一个
- 兄弟”,完全不会碰后面多余的
- ,性能最优。
顺带解释下你之前的问题
你之前用page.at('div').search('~ ul').first时,search('~ ul')会先把
之后所有
- 都查出来,再取第一个,这一步在
- 数量多的时候会做很多无用功。而上面的几种方案都是直接定位目标节点,一步到位,不用额外处理多余节点。
内容的提问来源于stack exchange,提问作者Matrix
相关产品推荐
相关产品推荐

