`&' interpreted as argument prefix


#1

Hi,
I’m new to rubi and at present i’m trying to write a sample code for
html extraction and store it in the database. The following is the code
for that :

doc = Hpricot(open(“http://www.google.com/”))
(doc/“a”).each do |link|
if (link.attributes[‘class’] == ‘gb1’)
href = link.inner_text.strip
con = DBI.connect(“DBI:Mysql:Sample:localhost”, “arunkumar”,
“123456”)
stat = con.prepare(“Insert into hello values (’’, ?, ‘GK’, 71,
‘female’)”)
stat.execute("#{href}")
stat.finish
con.commit
puts “Records have been inserted”
else
puts “Sorry! No matches found.”
end
end

When i execute it all works well except a warning saying :
/usr/lib/ruby/gems/1.8/gems/hpricot-0.6.164/lib/hpricot/builder.rb:26:
warning: `&’ interpreted as argument prefix

I dont know where went wrong for such a warning to get displayed. Please
help.

Regards
Arun K.


#2

On Mar 15, 2009, at 21:14 , Arun K. wrote:

   con = DBI.connect("DBI:Mysql:Sample:localhost", "arunkumar",

end

When i execute it all works well except a warning saying :
/usr/lib/ruby/gems/1.8/gems/hpricot-0.6.164/lib/hpricot/builder.rb:26:
warning: `&’ interpreted as argument prefix

that’s from hpricot and won’t change anytime soon :confused:

you may want to switch to mechanize instead. Kill two birds with one
stone.


#3

Arun K. wrote:

Hi,
I’m new to rubi and at present i’m trying to write a sample code for
html extraction and store it in the database. The following is the code
for that :

doc = Hpricot(open(“http://www.google.com/”))

The offending line is:

   ele.instance_variable_set("@#{k}", v)

Apparently Google pages contain very complex HTML, to relieve strain on
their
servers. Then, Hpricot does not “sanitize” its input. That k variable
might
contain a &, which Ruby then warns about. instance_variable_set()
creates an
instance variable, like this:

@foo = v

where ‘foo’ was in k. But if k contains ‘&foo’, you get this:

@&foo = v

You can’t write that in raw Ruby, so instance_variable_set() is warning
you that
you should not write it in “meta-programming” Ruby either.

But none of this is your fault: It’s a bug in Hpricot, which Google’s
advanced
HTML uncovered.

The conclusion: Switch to Nokogiri. It has an Hpricot compatibility
mode, but
its internal engine is libxml, which is one of the industry’s leading
XML (and
therefor HTML) implementations.


#4

2009/3/16 Phlip removed_email_address@domain.invalid:

   ele.instance_variable_set("@#{k}", v)

Well, I don’t think so.

The offending line is:
ele.instance_eval &blk

If you modify it to
ele.instance_eval(&blk)
The warning is gone.

Regards,

Park H.


#5

On Mar 16, 2009, at 01:16 , Heesob P. wrote:

Well, I don’t think so.

The offending line is:
ele.instance_eval &blk

If you modify it to
ele.instance_eval(&blk)
The warning is gone.

yup yup…


#6

On Mon, 16 Mar 2009 03:16:57 -0500, Heesob P. wrote:

The offending line is:
The warning is gone.

Regards,

Park H.

Looks fixed if you get Hpricot version 0.6.211 or later.

http://github.com/why/hpricot/commit/
aa2b51651bee9b3770bc2ecb8f1886b47aee8584


#7

On Mar 16, 2009, at 08:37 , Ken B. wrote:

Looks fixed if you get Hpricot version 0.6.211 or later.

http://github.com/why/hpricot/commit/
aa2b51651bee9b3770bc2ecb8f1886b47aee8584

I’ve said it before and I’ll say it again: It isn’t fixed until it is
released.


#8

On Mon, 16 Mar 2009 14:12:17 -0500, Ryan D. wrote:

On Mar 16, 2009, at 08:37 , Ken B. wrote:

Looks fixed if you get Hpricot version 0.6.211 or later.

http://github.com/why/hpricot/commit/
aa2b51651bee9b3770bc2ecb8f1886b47aee8584

I’ve said it before and I’ll say it again: It isn’t fixed until it is
released.

OK. Somehow I thought that assigning a version number meant it was a
release.


#9

On Mon, 16 Mar 2009 19:42:00 -0500, Ken B. wrote:

released.

OK. Somehow I thought that assigning a version number meant it was a
release.

Today it was actually released, and an 0.7 gem is now on RubyForge.

–Ken


#10

Ryan D. wrote:

warning: `&’ interpreted as argument prefix

you may want to switch to mechanize instead. Kill two birds with one
stone.

Why two? Getting rid of this bug is one bird. Where’s the second?