我需要使用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}
也不起作用。关于我做错了什么想法?
我明白了。这是一个愚蠢的错误。您的所有解决方案都是正确的。
答案 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>