2016-04-05 3 views
1

В настоящее время я пытаюсь получить внутренний HTML-элемент на странице с помощью nokogiri. Однако я не просто получаю текст элемента, я также получаю его escape-последовательности. Есть ли способ подавить или удалить их с помощью 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 (или рубин) способ сделать это?

+0

Какие escape-последовательности? Я вижу только вкладки и новые строки, которые будут текстовым содержимым различных текстовых узлов. См. "[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.

Sidenote: css('td a'), вероятно, более эффективен, чем css('td').css('a').

+0

'css ('td> a'), вероятно, более эффективен ...' Он также будет возвращать разные результаты, если '' вложен внутри других тегов. –

+0

это сработало отлично, спасибо! –

+0

@theTinMan Действительно, спасибо, большой знак был избыточным, исправленным. – mudasobwa

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" 

at, at_css и at_xpath возвращают Node/XML :: Element. search, css и xpath Верните узел NodeSet. Там есть большая разница в том, как textinner_html или возврата информации при взгляде на узел или NodeSet:

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 вернулся NodeSet и text возвращаемый текст этого узла объединяются вместе. Это редко то, что вы хотите.

Также обратите внимание, что Nokogiri достаточно умен, чтобы выяснить, является ли селектор CSS или XPath 99% времени, поэтому использование общих search и at для любого типа селектора очень удобно.

+0

Это было очень полезно! Я все еще изучаю in's и out of 'at' и' search', поэтому эти примеры очень ценятся! –