【问题标题】:How to get Nokogiri inner_HTML object to ignore/remove escape sequences如何让 Nokogiri inner_HTML 对象忽略/删除转义序列
【发布时间】:2016-04-05 15:08:23
【问题描述】:

目前,我正在尝试使用 nokogiri 获取页面上元素的内部 HTML。但是,我不仅得到了元素的文本,还得到了它的转义序列。有没有办法可以用 nokogiri 压制或删除它们?

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​​)方法是什么?

【问题讨论】:

  • 什么转义序列?我只看到制表符和换行符,它们是各种文本节点的文本内容。请参阅“minimal reproducible example”。如果没有最少量的 HTML 示例,就很难给出任何详细的答案。

标签: ruby nokogiri open-uri


【解决方案1】:
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') 更有效。

【讨论】:

  • css('td > a') is likely more efficient... 如果<a> 嵌套在其他标签中,也会返回不同的结果。
  • @theTinMan 确实,谢谢,更大的符号是多余的,已修复。
【解决方案2】:

深入到包含所需文本的最近节点非常重要。考虑一下:

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 返回一个 Node/XML::Element。 searchcssxpath 返回一个 NodeSet。在查看 Node 或 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 返回一个NodeSet,而text 返回连接在一起的节点文本。这很少是你想要的。

还请注意,Nokogiri 足够聪明,可以在 99% 的情况下判断选择器是 CSS 还是 XPath,因此对任一类型的选择器使用通用的 searchat 非常方便。

【讨论】:

  • 这很有帮助!我还在学习atsearch 的进出,所以非常感谢这些例子!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 2014-06-22
相关资源
最近更新 更多