使用CSS或XPath按内容选择元素

时间:2012-09-10 06:56:23

标签: ruby xpath css-selectors capybara

如何使用CSS或XPath在下面的代码中获取文本“Next”的链接?

<div id="pagination">
    <a href="link">2</a>
    <a href="link">3</a>
    <a href="link">4</a>
    <a href="link">5</a>
    <a href="link">6</a>
    <a href="link">7</a>
    <a href="link">8</a>
    <a href="link">9</a>
    <a href="link">10</a>
    <a href="link">Next</a>
    <a href="link">Last</a>
</div>

4 个答案:

答案 0 :(得分:2)

目前还不是很清楚你想要什么。如果你想要第十个链接:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div id="pagination">
    <a href="link">2</a>
    <a href="link">3</a>
    <a href="link">4</a>
    <a href="link">5</a>
    <a href="link">6</a>
    <a href="link">7</a>
    <a href="link">8</a>
    <a href="link">9</a>
    <a href="link">10</a>
    <a href="link">Next</a>
    <a href="link">Last</a>
</div>
EOT

doc.search('a')[9]
=> #<Nokogiri::XML::Element:0x80763880 name="a" attributes=[#<Nokogiri::XML::Attr:0x80763498 name="href" value="link">] children=[#<Nokogiri::XML::Text:0x80762fd4 "Next">]>

或者:

doc.at('//a[9]')

如果您不知道它将是哪个元素编号但是要关闭文本并想要使用CSS,我会这样做:

doc.search('a').select{ |n| n.content == 'Next' }.first

不幸的是,CSS无法搜索标签的文字,所以你必须有点创意。 XPath可以做到:

doc.at('//a[text()="Next"]')

答案 1 :(得分:1)

path = "/a[.='Next']"

对该路径进行查询,您将获得带有“下一步”的a元素,因为它是text()

答案 2 :(得分:0)

如果规则是a,其字符串值为"Next"div的最后一个孩子,请使用

//div[@id='pagination']/a[last()-1]

在这里,我们假设XML文档中至多存在一个div,其id属性的值为"pagination" - 这是对XHTML文档的公平假设。

基于XSLT的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
     <xsl:copy-of select="//div[@id='pagination']/a[last()-1]"/>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时

<div id="pagination">
    <a href="link">2</a>
    <a href="link">3</a>
    <a href="link">4</a>
    <a href="link">5</a>
    <a href="link">6</a>
    <a href="link">7</a>
    <a href="link">8</a>
    <a href="link">9</a>
    <a href="link">10</a>
    <a href="link">Next</a>
    <a href="link">Last</a>
</div>

评估XPath表达式,并将此评估中的选定节点复制到输出中:

<a href="link">Next</a>

答案 3 :(得分:0)

实际上,也可以使用css执行此操作:

 #pagination a:nth-last-child(2)

假设它总是最后一个,你可以使用css 3选择器