Ruby grep <body>标记内的所有行

问题描述

如何使用body grep ruby标记内的所有行?我知道可以使用Nokogiri解决此问题,但我想学习如何操作。

示例:

<body>
  <h1>Hello world</h1>
  <div>
    <button>Submit</button>
  </div>
</body>

在上面的示例中,我想要body标记内的所有行,它们是h1divbutton元素。

文件路径链接:"#{Rails.root}/app/templates/example.html"

解决方法

使用XPath

您可以使用XPath如下收集您的body标签内的节点:

require 'nokogiri'

html_fragment = <<~'EOF'
  <body>
    <h1>Hello world</h1>
    <div>
      <button>Submit</button>
    </div>
  </body>
EOF

fragment = Nokogiri::HTML.parse html_fragment
nodes    = fragment.xpath './/body/*'

此后,您可以对节点执行任何您想做的事情,以解决您的特定用例。一些示例包括:

nodes.map &:text
#=> ["Hello world","\nSubmit\n"]

nodes.map &:to_s
#=> ["<h1>Hello world</h1>","<div>\n<button>Submit</button>\n</div>"]

nodes.to_html
#=> "<h1>Hello world</h1><div>\n<button>Submit</button>\n</div>"

nodes.inner_html
#=> "Hello world\n<button>Submit</button>\n"

另请参见

,

您的描述不够精确,无法确切了解您想要什么。

str = <<~STR
<body>
  <h1>Hello world</h1>
  <div>
    <button>Submit</button>
  </div>
</body>
STR

str[%r{<body>(.*)</body>}m,1]

您所描述的确实可以做到,但并非在所有情况下都是可靠的。即使在HTML注释中找到了这些字符,它也将分别在<body></body>之间开始捕获和结束捕获。一个可能失败的示例:

<body>
  <h1>Hello world</h1>
  <div>
    <button>Submit</button>
  </div>
</body>
<!-- </body> -->

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...