问题描述
如何使用body
grep ruby
标记内的所有行?我知道可以使用Nokogiri
解决此问题,但我想学习如何操作。
示例:
<body>
<h1>Hello world</h1>
<div>
<button>Submit</button>
</div>
</body>
在上面的示例中,我想要body
标记内的所有行,它们是h1
,div
和button
元素。
文件路径链接:"#{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"
另请参见
- Parsing an HTML / XML Document
- Searching an HTML / XML Document
- Nokogiri::Searchable#xpath
- Nokogiri Cheat Sheet
您的描述不够精确,无法确切了解您想要什么。
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> -->