2016-04-05 57 views
1

目前,我正在嘗試使用nokogiri在頁面上獲取元素的內部HTML。不過,我不只是獲取元素的文本,我也獲得了它的轉義序列。有沒有辦法可以用nokogiri壓制或刪除它們?如何讓Nokogiri inner_HTML對象忽略/刪除轉義序列

require 'nokogiri' 
require 'open-uri' 

page = Nokogiri::HTML(open("http://the.page.url.com")) 

page.at_css("td[custom-attribute='foo']").parent.css('td').css('a').inner_html 

這將返回=>"\r\n\t\t\t\t\t\t\t\tTheActuallyInnerContentThatIWant\r\n\t"

什麼是最有效,最直接的引入nokogiri(或Ruby)這樣的方式?

+0

什麼是轉義序列?我只看到標籤和新行,這將是各種文本節點的文本內容。請參閱「[mcve]」。沒有HTML的最小樣本,很難給出任何詳細的答案。 –

回答

2
page.at_css("td[custom-attribute='foo']") 
    .parent 
    .css('td') 
    .css('a') 
    .text    # since you need a text, not inner_html 
    .strip    # this will strip a result 

String#strip

旁註css('td a')可能比css('td').css('a')效率更高。

0

鑽入包含所需文本的最近節點非常重要。試想一下:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<html> 
    <body> 
    <p>foo</p> 
    </body> 
</html> 
EOT 

doc.at('body').inner_html # => "\n <p>foo</p>\n " 
doc.at('body').text # => "\n foo\n " 
doc.at('p').inner_html # => "foo" 
doc.at('p').text # => "foo" 

atat_cssat_xpath返回節點/ XML ::元素。 search,cssxpath返回一個NodeSet。有一個節點或節點集看時textinner_html回報如何信息有很大的不同:

doc = Nokogiri::HTML(<<EOT) 
<html> 
    <body> 
    <p>foo</p> 
    <p>bar</p> 
    </body> 
</html> 
EOT 

doc.at('p') # => #<Nokogiri::XML::Element:0x3fd635cf36f4 name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf3514 "foo">]> 
doc.search('p') # => [#<Nokogiri::XML::Element:0x3fd635cf36f4 name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf3514 "foo">]>, #<Nokogiri::XML::Element:0x3fd635cf32bc name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf30dc "bar">]>] 

doc.at('p').class # => Nokogiri::XML::Element 
doc.search('p').class # => Nokogiri::XML::NodeSet 

doc.at('p').text # => "foo" 
doc.search('p').text # => "foobar" 

注意使用search返回一個節點集和text返回節點的文本連接在一起。這很少是你想要的。

還要注意引入nokogiri是足夠聰明,想出一個選擇是CSS或XPath的99%的時間,所以使用任何類型選擇的一般searchat非常方便。

+0

這非常有幫助!我仍然在學習'at'和'search'的進出,所以這些例子非常感謝! –