gpt4 book ai didi

ruby - 如何搜索和替换节点 Nokogiri?

转载 作者:数据小太阳 更新时间:2023-10-29 08:49:15 25 4
gpt4 key购买 nike

我有一个 HTML 文档作为字符串。我使用 Nokogiri 解析了它:

doc_str = <<-mydoc
<p>Lorem ipsum dolor sit foo.</p>
<h2>Consectetur adipisicing bar</h2>
<p>Foo do <a href="/c-foo.aspx" class = "foo" title="Foo bar.">foofoo foo</a>.</p>
mydoc

doc = Nokogiri::HTML doc_str

我想用 "Bar"/"bar" 替换 "foo"/"Foo"在所有可见文本中:

desired = <<-mydoc
<p>Lorem ipsum dolor sit bar.</p>
<h2>Consectetur adipisicing bar</h2>
<p>Bar do <a href="/c-foo.aspx" class = "foo" title="Bar bar.">foofoo bar</a>.</p>
mydoc

我该怎么做?

我试图阅读 Nokogiri tutorial ,它描述了 Nokogiri::HTML::Document#at_css。使用 Ruby 2.0 和最新的 Nokogiri,doc.at_css 'h1' 返回 nil,因此 h1.content = "something" 甚至不是可能的。

即使它有效,也只是解决我的查找和替换问题的第一步。

最佳答案

doc.at_css 'h1' 返回 nil 因为您的 HTML 中没有 h1 元素。 doc.at_css 'h2' 正确返回 h2 元素的 Nokogiri::XML::Element 对象。

CSS 选择器无法选择文本节点,对于这类事情来说是一个糟糕的工具。 XPath 将完成 CSS 所做的所有工作,并且除此之外还有更多。文档根目录下任何位置的文本节点都只是 //text()

编辑 我刚刚注意到您似乎希望以相同的方式更改属性的内容。 @* 匹配任何属性,因此 XPath 表达式变为 //@* |//文本()。虽然我不清楚这一点,因为 href="/c-foo.aspx"class="foo" 保持不变,但 title="Foo bar ." 变成 title="bar bar."。我相信您可以自己解决这个问题。

您需要使用 XPath 找到所有文本节点,然后使用 content 获取每个节点的文本值。根据需要修改它并使用 content= 替换它。

本程序演示。 to_html 方法将数据包装在使其成为有效 HTML 所需的标记中。

require 'nokogiri'

doc_str = <<-HTML
<p>Lorem ipsum dolor sit foo.</p>
<h2>Consectetur adipisicing bar</h2>
<p>Foo do <a href="/c-foo.aspx" class = "foo" title="Foo bar.">foofoo foo</a>.</p>
HTML

doc = Nokogiri::HTML(doc_str)

doc.xpath('//@*', '//text()').each do |node|
node.content = node.content.gsub(/\bfoo\b/, 'bar').gsub(/\bFoo\b/, 'Bar')
end

puts doc.to_html

输出

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>Lorem ipsum dolor sit bar.</p>
<h2>Consectetur adipisicing bar</h2>
<p>Bar do <a href="/c-bar.aspx" class="bar" title="Bar bar.">foofoo bar</a>.</p>
</body></html>

关于ruby - 如何搜索和替换节点 Nokogiri?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17478383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com