Hi all,
I want to find the path to a tag I am interested using hpricot.
According to the document and examples I think I should use #xpath
method.
I expect that ruby will return the path as this:
“/tag1/tag2/div[@id=‘header’]”
but I get the following info:
tag1.rb:4: undefined method `xpath’ for nil:NilClass (NoMethodError)
I wonder why method #xpath is not defined?
Thanks,
Li
###########################################
Here is my code:
require ‘hpricot’
doc=Hpricot(open(‘tag.txt’))
puts doc
puts doc.at(“header”).xpath()
########tag.txt##########
On Aug 12, 2:03 pm, Li Chen [email protected] wrote:
tag1.rb:4: undefined method `xpath’ for nil:NilClass (NoMethodError)
I wonder why method #xpath is not defined?
Look carefully. It’s not defined for nil. Which means that
doc.at(“header”) is returning nil. That’s because there are no
elements with the name of “header”; only an attribute. Try using the
css selector “#header”.
Mark T. wrote:
css selector “#header”.
Oops - .header would have been a class, and #header is for an id. I got
them
backwards!
Mark T. wrote:
Look carefully. It’s not defined for nil. Which means that
doc.at(“header”) is returning nil. That’s because there are no
elements with the name of “header”; only an attribute. Try using the
css selector “#header”.
Here is the result after I change to css selector or xpath;
puts doc.at("#header").xpath()
ag1.rb:4: undefined method `xpath’ for {elem
{text "
\n" " "}}:Hpricot::Elem (NoMethodError)
puts doc.at("#header").css_path()
tag1.rb:4: undefined method `css_path’ for {elem
{text
" \n" " "}}:Hpricot::Elem (NoMethodError)
Li
Are you using an old version of Hpricot? When I run this code:
#!/usr/bin/env ruby
require ‘rubygems’
require ‘hpricot’
doc = Hpricot(open(“tag.txt”))
puts doc.at("#header").xpath
I get the following result:
//div[@id=‘header’]
I’m using Hpricot 0.6 (do a gem list --local to see your version)
Li Chen wrote:
I wonder why method #xpath is not defined?
You gotta learn what those errors look like. If you have a ‘nil’ where
you don’t
expect it, the error happens when you use the nil incorrectly, such as
calling a
method - like xpath - that nil does not have.
Your doc.at(“header”) returns nil.
require ‘hpricot’
doc=Hpricot(open(‘tag.txt’))
puts doc
puts doc.at(“header”).xpath()
What does p doc.at(‘header’) say? Would a .search (or equivalent) for
‘.header’
work?
Mark T. wrote:
Are you using an old version of Hpricot? When I run this code:
#!/usr/bin/env ruby
require ‘rubygems’
require ‘hpricot’
doc = Hpricot(open(“tag.txt”))
puts doc.at("#header").xpath
I get the following result:
//div[@id=‘header’]
I’m using Hpricot 0.6 (do a gem list --local to see your version)
My version is 0.4. Since I can not install the new version remotely.
I want to install it locally. But I can’t find hpricot gem in Rubyfore.
Li
Li Chen wrote:
I’m using Hpricot 0.6 (do a gem list --local to see your version)
My version is 0.4. Since I can not install the new version remotely.
I want to install it locally. But I can’t find hpricot gem in Rubyfore.
Thank you all for the help.Now it works after install to the 0.6
version.
Li
tag1.rb:6: undefined method `xpath’ for nil:NilClass (NoMethodError)
Do you see the nil in that line? Where is the nil coming from? Is the
method
before the .xpath, on line 6, possibly returning a nil and not an Elem?
After pondering that, switch ‘#header’ to ‘.header’!
Hi all,
I find that in my code ‘xpath’ only works if the attribute is ‘id’. How
to explain it?
Another question: is it possible to get the path/tree relationship of a
tag(including its attributes)in the following format using hpricot or
the position of an interested tag within a html page/file:
tag1/tag2/
Thanks,
Li
###############tag.txt#######################
#I change id=“header” to class=“header”
ABC
tag1.rb:6: undefined method `xpath’ for nil:NilClass (NoMethodError)
Exit code: 1