如何删除具有给定src属性的图像节点?

时间:2010-12-05 03:33:11

标签: ruby nokogiri xpath

我需要使用give src删除图像

img_src = "http://domain/img.jpg"
@doc.xpath("//img[@src='#{img_src}']")[0].remove

不起作用。试过它也喜欢这个

@doc.xpath("//img[@src='#{img_src}']") {|x| x.remove}

也不起作用。关于我做错了什么想法?

我明白了。这是一个愚蠢的错误。您的所有解决方案都是正确的。

2 个答案:

答案 0 :(得分:2)

Nokogiri有两种不同的解析器模式,一种用于XML,另一种用于HTML。 XML是严格的,HTML非常宽松,因为HTML并不总是表现良好。

doc = Nokogiri::XML('<xml><a>1</a></xml>')

doc = Nokogiri::HTML('<html><body>foo</body></html>')

这就是我一般parse an HTML file

的方式
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://www.example.com'))
print doc.to_html
# >> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
[...]

要剥离标记,您需要先找到它,然后remove。在我们解析HTML或XML文档之后,我们将分别有一个Nokogiri :: HTML或Nokogiri :: XML文档,此时我们所谓的“标记”现在称为“节点”。 Nokogiri可以找到节点集,这些节点集是与搜索匹配的节点,或者是单个节点,这将是搜索的第一个匹配。

这将使用CSS访问器搜索匹配src="a.png"的第一个节点,这通常比XPath更容易/更清晰。 Nokogiri非常了解XPath和CSS,并且网站上提到的CSS有一些优点:

require 'nokogiri'
require 'open-uri'

html = '<html><body><img src="a.png" /><img src="b.png" /></body></html>'

doc = Nokogiri::HTML(html)
doc.at('img[@src="a.png"]').remove
print doc.to_html
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# >> <html><body><img src="b.png"></body></html>

要找到与访问者匹配的所有节点,您可以将doc.at('img[@src="a.png"]').remove替换为:

doc.search('img[@src="a.png"]').each { |n| n.remove }

tutorials也值得一读。

答案 1 :(得分:1)

适合我:

require 'nokogiri'
xml = <<ENDXML
  <root>
    <img src="http://foo/foo.jpg" />
    <img src="http://bar/bar.jpg" />
  </root>
ENDXML

doc = Nokogiri::XML xml
img_src = "http://foo/foo.jpg"

doc.at_xpath("//img[@src='#{img_src}']").remove

puts doc
#=> <?xml version="1.0"?>
#=> <root>
#=> 
#=> <img src="http://bar/bar.jpg"/>
#=> </root>