Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > A few confusing Hpricot outputs. Anyone had similar experience?

Reply
Thread Tools

A few confusing Hpricot outputs. Anyone had similar experience?

 
 
Wang Jian
Guest
Posts: n/a
 
      04-06-2009
[Note: parts of this message were removed to make it a legal post.]

## I wanted to work on something like the following example string

require 'hpricot'
string = '<html><a></a><a href="/123/456" title="2009-04-06">posted on April
2009</a></html>'
h = Hpricot(string)
t = "2009-04-06"

## Here it goes: confusion No.1

h.at('a[@title*="2009-04-06"]')
##=> returns the 2nd anchor element, as expected.
h.at('a[@title*=Time.now.strftime("%Y-%m-%d")]')
##=> *1st anchor element. Why is that??*
h.at("a[@title*=#{t}]")
##=> 2nd anchor. works fine
h.at('a[@title*="#{t}"]')
##=> *nil. Because of the single quote?*

## And here comes another confusion:

year = "2009"
h.at("a[@title*=#{t}][text()*='2009']")
##=> 2nd anchor, as expected.
h.at("a[@title*=#{t}][text()*=#{year}]")
##=> *nil. Why is that? Hpricot can't handle #{} more than once?*

## Hope you can fill me in on this one. Thanks!!

##Jay

 
Reply With Quote
 
 
 
 
Christopher Dicely
Guest
Posts: n/a
 
      04-06-2009
On Mon, Apr 6, 2009 at 4:11 AM, Wang Jian <(E-Mail Removed)> wrote:
> ## I wanted to work on something like the following example string
>
> require 'hpricot'
> string = '<html><a></a><a href="/123/456" title="2009-04-06">posted on April
> 2009</a></html>'
> h = Hpricot(string)
> t = "2009-04-06"
>
> ## Here it goes: confusion No.1
>
> h.at('a[@title*="2009-04-06"]')
> ##=> returns the 2nd anchor element, as expected.
> h.at('a[@title*=Time.now.strftime("%Y-%m-%d")]')
> ##=> *1st anchor element. Why is that??*


I'm not sure why it is returning {emptyelem <a>}, but I can tell you
why its not returning the element you expect: because you didn't use
string interpolation so that the call to Time.now.strftime(...) would
be evaluated and inserted into the string. This selects the expected
element:

h.at("a[@title*=#{Time.now.strftime('%Y-%m-%d')}]")

> h.at("a[@title*=#{t}]")
> ##=> 2nd anchor. works fine
> h.at('a[@title*="#{t}"]')
> ##=> *nil. Because of the single quote?*


Exactly, that's just ruby single- versus double-quote string behavior.
With the same setup as you used:

irb(main):037:0> "#{t}"
=> "2009-04-06"
irb(main):038:0> '#{t}'
=> "\#{t}"

>
> ## And here comes another confusion:
>
> year = "2009"
> h.at("a[@title*=#{t}][text()*='2009']")
> ##=> 2nd anchor, as expected.
> h.at("a[@title*=#{t}][text()*=#{year}]")
> ##=> *nil. Why is that? Hpricot can't handle #{} more than once?*


Do you mean for these to pass different strings to h.at()? Look at the
strings you are using.

irb(main):048:0> puts [ "a[@title*=#{t}][text()*='2009']",
irb(main):049:1* "a[@title*=#{t}][text()*=#{year}]" ]
a[@title*=2009-04-06][text()*='2009']
a[@title*=2009-04-06][text()*=2009]

So, you are just getting unreliable results when you aren't using
quotes around the values you are searching for. This version works,
where the second one above did not:

h.at("a[@title*='#{t}'][text()*='#{year}']")

Note that I've put quotes on both values, though at least in this
example the title appears to work without them.

 
Reply With Quote
 
 
 
 
Wang Jian
Guest
Posts: n/a
 
      04-07-2009
[Note: parts of this message were removed to make it a legal post.]

Great notes. Thanks a lot!

So the take home message is like always use " on the very outside, and use
(literally) '#{expression}' to ensure consistency.

It's kinda counter-intuitive at first look, as normally the #{} won't work
when placed in between single quotes. But it works in this one.

2009/4/6 Christopher Dicely <(E-Mail Removed)>

> On Mon, Apr 6, 2009 at 4:11 AM, Wang Jian <(E-Mail Removed)> wrote:
> > ## I wanted to work on something like the following example string
> >
> > require 'hpricot'
> > string = '<html><a></a><a href="/123/456" title="2009-04-06">posted on

> April
> > 2009</a></html>'
> > h = Hpricot(string)
> > t = "2009-04-06"
> >
> > ## Here it goes: confusion No.1
> >
> > h.at('a[@title*="2009-04-06"]')
> > ##=> returns the 2nd anchor element, as expected.
> > h.at('a[@title*=Time.now.strftime("%Y-%m-%d")]')
> > ##=> *1st anchor element. Why is that??*

>
> I'm not sure why it is returning {emptyelem <a>}, but I can tell you
> why its not returning the element you expect: because you didn't use
> string interpolation so that the call to Time.now.strftime(...) would
> be evaluated and inserted into the string. This selects the expected
> element:
>
> h.at("a[@title*=#{Time.now.strftime('%Y-%m-%d')}]")
>
> > h.at("a[@title*=#{t}]")
> > ##=> 2nd anchor. works fine
> > h.at('a[@title*="#{t}"]')
> > ##=> *nil. Because of the single quote?*

>
> Exactly, that's just ruby single- versus double-quote string behavior.
> With the same setup as you used:
>
> irb(main):037:0> "#{t}"
> => "2009-04-06"
> irb(main):038:0> '#{t}'
> => "\#{t}"
>
> >
> > ## And here comes another confusion:
> >
> > year = "2009"
> > h.at("a[@title*=#{t}][text()*='2009']")
> > ##=> 2nd anchor, as expected.
> > h.at("a[@title*=#{t}][text()*=#{year}]")
> > ##=> *nil. Why is that? Hpricot can't handle #{} more than once?*

>
> Do you mean for these to pass different strings to h.at()? Look at the
> strings you are using.
>
> irb(main):048:0> puts [ "a[@title*=#{t}][text()*='2009']",
> irb(main):049:1* "a[@title*=#{t}][text()*=#{year}]" ]
> a[@title*=2009-04-06][text()*='2009']
> a[@title*=2009-04-06][text()*=2009]
>
> So, you are just getting unreliable results when you aren't using
> quotes around the values you are searching for. This version works,
> where the second one above did not:
>
> h.at("a[@title*='#{t}'][text()*='#{year}']")
>
> Note that I've put quotes on both values, though at least in this
> example the title appears to work without them.
>
>


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Few things confusing a newbie while writing JavaScript Oltmans Javascript 1 03-21-2011 04:26 PM
Any similar Webcam broadcasting site similar to youtube Chaudhry Nijjhar Computer Support 0 02-19-2008 11:48 PM
Hpricot - Trying to do a few things...are they possible? HH Ruby 2 10-03-2006 10:01 PM
Have you ever had your computer crashed at 3am and wished that you had someone to call? lifestylelink Computer Support 10 08-12-2006 03:05 PM
freqk dei in indai had lots of time ...but very few gals interestedin me or i was interested with .. kk Firefox 0 04-15-2004 05:18 AM



Advertisments