我下手:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<td class="browse-cell-date">
<span title="Last sold date">
May 2002
</span>
<button class="btn btn-previous-sales js-btn-previous-sales">
Previous sales (1) <i class="icon icon-down-open-1"/>
</button>
<div class="previous-sales-panel is-hidden">
<span style="display: block;">
Aug 1997
<span class="fright">£60,000</span>
</span>
</div>
</td>
EOT
sold_date = doc.at('span[title="Last sold date"]') # => #<Nokogiri::XML::Element:0x3ffc7e84c35c name="span" attributes=[#<Nokogiri::XML::Attr:0x3ffc7e84c2f8 name="title" value="Last sold date">] children=[#<Nokogiri::XML::Text:0x3ffc7e82bc10 "\n May 2002 \n ">]>
sold_date.text # => "\n May 2002 \n "
sold_date.text.strip # => "May 2002"
所以
doc.at('span[title="Last sold date"]').text.strip # => "May 2002"
將做到這一點。
at
就像search('some selector').first
所以用它來方便。 at
和search
都足夠聰明,可以在大多數情況下確定選擇器是CSS還是XPath,因此我使用這些選擇器。如果Nokogiri被愚弄,我會恢復使用*_css
或*_xpath
變體之一。
或者你可以使用:
doc.at('td.browse-cell-date span').text.strip # => "May 2002"
doc.at('td.browse-cell-date > span').text.strip # => "May 2002"
注意:使用text
與任何search
,xpath
或css
方法是不是一個好主意。這些方法返回一個NodeSet,當您使用其方法text
時,這不會達到您所期望的。考慮這些例子:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
<p>bar</p>
</body>
</html>
EOT
doc.search('p').class # => Nokogiri::XML::NodeSet
doc.search('p').text # => "foobar"
我們經常看到人們這樣做,然後需要弄清楚如何級聯文本分成有用的東西,這通常是非常困難的問題。
99。的99%的時間,你想用以下map(&:text)
來提取節點集文字:
doc.search('p').map(&:text) # => ["foo", "bar"]
但是,在你使用時,只需使用at
,它返回一個節點,然後text
會做你的期望。
你試過'.val()'嗎? – davidhu2000
@ davidhu2000,剛剛使用了'val'並得到了一個錯誤'NoMethodError(未定義的方法val'爲零:NilClass):' – Raaz