How to delete a node with Hpricot?

D

Daniel N

Hi,

Sorry if this is not the right forum for this question.

If a node is bad I'm trying to comment it out. If it's really bad
I'm trynig to delete it.

The way I'm trying to do is is as follows.

def this_is_a_problem
doc = Hpricot( html )
doc.traverse_element do |node|
if some_bad_node_test
unless really_bad?
node.swap( "<!-- comment out node #{node.to_html} -->" )
else
node.swap( "" )
end
end
doc.to_html
end

However I'm getting a nasty error.

TypeError: no implicit conversion from nil to integer
/usr/local/lib/ruby/gems/1.8/gems/hpricot-0.5/lib/hpricot/traverse.rb:395:in
`[]='

Am I doing this the wrong way?

Thanx

Daniel
 
E

eden li

I can't comment on the error, but you can delete a given node in your
traverse_element block by doing node.parent.children.delete(node).

Alternatively, you can run a search first to remove the "really bad
elements." If you define really bad elements in terms of an xpath
query, this becomes very simple:

(doc/"script").remove

Then you can go through and swap things out as necessary:

(doc/"xpath to bad nodes").each do |el|
el.inner_html = "<!-- #{el.to_html} -->"
end
 
D

Daniel N

I can't comment on the error, but you can delete a given node in your
traverse_element block by doing node.parent.children.delete(node).

Alternatively, you can run a search first to remove the "really bad
elements." If you define really bad elements in terms of an xpath
query, this becomes very simple:

(doc/"script").remove

Then you can go through and swap things out as necessary:

(doc/"xpath to bad nodes").each do |el|
el.inner_html = "<!-- #{el.to_html} -->"
end

Hi,

Sorry if this is not the right forum for this question.

If a node is bad I'm trying to comment it out. If it's really bad
I'm trynig to delete it.

The way I'm trying to do is is as follows.

def this_is_a_problem
doc = Hpricot( html )
doc.traverse_element do |node|
if some_bad_node_test
unless really_bad?
node.swap( "<!-- comment out node #{node.to_html} -->" )
else
node.swap( "" )
end
end
doc.to_html
end

However I'm getting a nasty error.

TypeError: no implicit conversion from nil to integer
/usr/local/lib/ruby/gems/1.8/gems/hpricot-0.5/lib/hpricot/traverse.rb:395:in
`[]='

Am I doing this the wrong way?

Thanx

Daniel

Sweet, that looks like a good way to go. I'll try that out.

I've actually got it working but it's very very slow, hopefully this
will speed it up

Thankyou
Daniel
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,149
Members
46,695
Latest member
StanleyDri

Latest Threads

Top