[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Hpricot and xpath

Li Chen

8/12/2008 6:04:00 PM

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

9 Answers

Mark Thomas

8/12/2008 6:41:00 PM

0

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?

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

Phlip

8/12/2008 6:44:00 PM

0

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
http://www.oreillynet.com/onlamp/blog/2007/08/xpath_checker_and_assert_...

Phlip

8/12/2008 6:49:00 PM

0

Mark Thomas wrote:

> css selector "#header".

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

Li Chen

8/12/2008 6:53:00 PM

0

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

Mark Thomas

8/12/2008 7:09:00 PM

0

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

8/12/2008 7:35:00 PM

0

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

Li Chen

8/12/2008 8:13:00 PM

0

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

Li Chen

8/12/2008 8:57:00 PM

0

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

Phlip

8/13/2008 12:47:00 AM

0

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