的問題是你想使用starts_with
方法的對象沒有實現它。
item.css("a").each do |a|
將返回a
中的XML節點。那些屬於Nokogiri。你想要做什麼節點轉換爲文本,但要檢查,其中,因爲它是節點的參數,可以這樣只能訪問部分:
a['href']
所以,你要使用是這樣的:
item.css("a").each do |a|
if !(a.starts_with?['href']('http://'))
a.replace(a.content)
end
end
這樣做的缺點是你必須通過文檔中的每個<a>
標籤,它可以有很多的鏈接頁面大慢行走。
的另一種方法去了解它是使用XPath的starts-with
功能:
require 'nokogiri'
item = Nokogiri::HTML('<a href="doesnt_start_with">foo</a><a href="http://bar">bar</a>')
puts item.to_html
,輸出:
>> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
>> <html><body>
>> <a href="doesnt_start_with">foo</a><a href="http://bar">bar</a>
>> </body></html>
下面介紹如何使用XPath做到這一點:
item.search('//a[not(starts-with(@href, "http://"))]').each do |a|
a.replace(a.content)
end
puts item.to_html
哪些輸出:
>> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
>> <html><body>foo<a href="http://bar">bar</a>
>> </body></html>
使用XPath查找節點的好處是它全部以編譯後的C運行,而不是讓Ruby執行它。
非常徹底的答案。謝謝。 – pcasa 2011-05-16 19:35:02
沒問題。很高興它有幫助。 – 2011-05-16 22:36:19