`&' interpreted as argument prefix

A

Arun Kumar

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 Kumar
 
R

Ryan Davis

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

that's from hpricot and won't change anytime soon :/

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

Phlip

Arun said:
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.
 
H

Heesob Park

2009/3/16 Phlip said:
The offending line is:

=C2=A0 =C2=A0 =C2=A0ele.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 Heesob
 
A

Albert Schlef

Ryan said:
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?
 
K

Ken Bloom

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,045
Latest member
DRCM

Latest Threads

Top