2012-09-10 66 views
0

如何在使用CSS或XPath的代碼中使用文本「Next」獲取鏈接?使用CSS或XPath按內容選擇元素

<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> 
+0

難道你們就不能使用jquery或CSS是必須?我認爲使用CSS是不可能的。 – freebird

+0

由於水豚只支持它們,它必須是CSS或XPath。 –

回答

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,我d do:

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

不幸的是,CSS無法搜索標籤的文本,所以你必須有點創意。 XPath的可以做到這一點:

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

我不知道標籤的位置,因爲它發生了變化,所以第二個和第三個解決方案都很好。 –

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

該路徑做查詢,你會得到a元素與「下一步」,因爲它是text()

+0

你能解釋一下'.'的含義嗎?爲什麼不''/ a [text()='Next'「' –

+0

當然你也可以這樣做!如果我沒有錯,'''基本上就是'當前節點'。我從前面記得''',所以現在不能確定*它是什麼。 – Prasanth

0

如果規則是,其字符串值是"Next"adiv最後只有一個孩子,只要使用

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

在這裏,我們假設在id屬性的值爲"pagination"的XML文檔中最多存在一個div - 這是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> 
0

其實,還可以用CSS來做到這一點:

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

假設它始終是第二個上了,你可以使用CSS 3個選擇