Ruby 如何更改具有匹配内容的元素类

Ruby 如何更改具有匹配内容的元素类,ruby,nokogiri,Ruby,Nokogiri,我有: <div class="bar">baz</div> <div class="foo">qux</div> <div class="foo">qux</div> <div class="foo">baz</div> <div class="foo">qux</div> <div class="foo">baz</div> <div clas

我有:

<div class="bar">baz</div>
<div class="foo">qux</div>
<div class="foo">qux</div>
<div class="foo">baz</div>
<div class="foo">qux</div>
<div class="foo">baz</div>
<div class="foo">qux</div>
但是,在找到匹配的内容和替换类方面,我没有做过任何尝试

您可以使用
body.css('div:contains(“”))
来匹配包含所需文本内容的节点

您可以通过以下方式实现您想要的:

require 'nokogiri'

input = '<div class="bar">baz</div>
<div class="foo">qux</div>
<div class="foo">qux</div>
<div class="foo">baz</div>
<div class="foo">qux</div>
<div class="foo">baz</div>
<div class="foo">qux</div>'

body = Nokogiri::HTML.fragment(input)

text_to_match = body.at_css('.bar').text

matching_nodes = body.css("div:contains('#{text_to_match}')")
matching_nodes.each do |node|
  node['class'] = 'bar'
end

puts body.to_html
需要“nokogiri”
输入='baz
库克斯
库克斯
巴兹
库克斯
巴兹
库克斯'
body=Nokogiri::HTML.fragment(输入)
text_to_match=body.at_css('.bar')。text
matching_nodes=body.css(“div:contains('#{text_to_match}'))
匹配_节点。每个do |节点|
节点['class']='bar'
结束
将body.to_html

小心使用
body.css(“div:contains('{text_to_match}')”)

产出将是:

<div class="bar">baz</div>
<div class="foo">qux</div>
<div class="foo">qux</div>
<div class="foo">baza</div>
<div class="foo">qux</div>
<div class="foo">bazfdsfsdf</div>
<div class="bar">baz</div>
baz
库克斯
库克斯
巴扎
库克斯
bazfdsfsdf
巴兹

我会这样做:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div class="bar">baz</div>
<div class="foo">qux</div>
<div class="foo">baz</div>
EOT

target_text = doc.at('.bar').text # => "baz"
doc.search("//div[text()='#{target_text}']").each do |div|
  div['class'] = 'bar'
end
需要“nokogiri”

doc=Nokogiri::HTML(很酷,谢谢你,这很管用!现在唯一的问题是它也针对包含baz的div。必须弄清楚如何只针对直接包含baz的div,而不是它们的父div。“必须弄清楚如何只针对直接包含baz的div,而不是它们的父div”所以你的例子和问题不应该是什么?不要问那些令人毛骨悚然的问题;先弄清楚真正的问题是什么,然后再问。不这样做会浪费每个人的时间。
input = '<div class="bar">baz</div>
<div class="foo">qux</div>
<div class="foo">qux</div>
<div class="foo">baza</div>
<div class="foo">qux</div>
<div class="foo">bazfdsfsdf</div>
<div class="foo">qux</div>'
<div class="bar">baz</div>
<div class="foo">qux</div>
<div class="foo">qux</div>
<div class="bar">baza</div>
<div class="foo">qux</div>
<div class="bar">bazfdsfsdf</div>
<div class="foo">qux</div>
input = '<div class="bar">baz</div>
<div class="foo">qux</div>
<div class="foo">qux</div>
<div class="foo">baza</div>
<div class="foo">qux</div>
<div class="foo">bazfdsfsdf</div>
<div class="foo">baz</div>'
<div class="bar">baz</div>
<div class="foo">qux</div>
<div class="foo">qux</div>
<div class="foo">baza</div>
<div class="foo">qux</div>
<div class="foo">bazfdsfsdf</div>
<div class="bar">baz</div>
require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div class="bar">baz</div>
<div class="foo">qux</div>
<div class="foo">baz</div>
EOT

target_text = doc.at('.bar').text # => "baz"
doc.search("//div[text()='#{target_text}']").each do |div|
  div['class'] = 'bar'
end
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<div class="bar">baz</div>
<div class="foo">qux</div>
<div class="bar">baz</div>
</body></html>