Hpricot and xpath

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##########
<tag1>
     <tag2>
       <div id='header'>
     </tag2>
</tag1>
--
Posted via http://www.ruby-forum.com/.

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".

···

On Aug 12, 2:03 pm, Li Chen <chen_...@yahoo.com> wrote:

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?

Li Chen wrote:

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?

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?

···

--
   Phlip
   O'Reilly Media - Technology and Business Training

Mark Thomas wrote:

css selector "#header".

Oops - .header would have been a class, and #header is for an id. I got them backwards!

Mark Thomas 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 <div id="header"> {text "
\n" " "}}:Hpricot::Elem (NoMethodError)

puts doc.at("#header").css_path()

tag1.rb:4: undefined method `css_path' for {elem <div id="header"> {text
" \n" " "}}:Hpricot::Elem (NoMethodError)

Li

···

--
Posted via http://www.ruby-forum.com/\.

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)

Mark Thomas 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

···

--
Posted via http://www.ruby-forum.com/\.

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

···

--
Posted via http://www.ruby-forum.com/\.

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/<div class="header">

Thanks,

Li

###############tag.txt#######################
#I change id="header" to class="header"
<tag1>
     <tag2>
       <div class="header">ABC </div>
     </tag2>
</tag1>
tag1.rb:6: undefined method `xpath' for nil:NilClass (NoMethodError)

···

Exit code: 1

--
Posted via http://www.ruby-forum.com/\.

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'!