Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Google Calculator command line tool

Reply
Thread Tools

Google Calculator command line tool

 
 
m4dc4p
Guest
Posts: n/a
 
      10-07-2005
I whipped a quick script to send queries to Google and scrape results
if it's a valid "calculator" query. If you don't know what I mean, put
"5 + 5" into the Google search box. I love the feature but hate having
to open a web browser each time I want to use it. Thus, this script!

I'm pretty much a n00b to Ruby so any feedback, improvements, comments
are appreciated. Enjoy!

--- cut here ---
require 'net/http'
require 'cgi'

format_result = Proc.new { |s|
s.gsub("<font size=-2>
</font>",",").gsub("×","x").gsub("<sup>","^").gsub(" </sup>", "")
}

matchExp = Regexp.new("<td><img
src=/images/calc_img.gif></td><td>&nbsp;</td><td nowrap>(.*?) =
(.*?)</b>")
while ((! (print "Enter an expression (exit to quit): "; line =
gets).nil?) && line.strip.upcase != "EXIT")
resp =
Net::HTTP.get_response(URI.parse("http://www.google.com/search?q=#{CGI.escape(line.strip)}"))
if resp.code == "200"
begin
matches = matchExp.match(resp.body)
puts "==>" + format_result.call(matches[2])
rescue NoMethodError
puts "==> Expression not understood."
rescue
puts "==> Expression not understood. (#{$!.class.inspect},
#{$!.inspect})"
end
else
puts "==> Response error: #{resp.code}"
end
end

 
Reply With Quote
 
 
 
 
m4dc4p
Guest
Posts: n/a
 
      10-07-2005
I should have explained the format_result proc a little. Google's
responses have spaces (using '<font size=-2> </font>') instead of
commas, so that is the first replacement. The second two deal with
scientific notation. Try entering a query like "400 lightyears * 10
parsecs" and you will see the characters its trying to replace.

 
Reply With Quote
 
 
 
 
Austin Ziegler
Guest
Posts: n/a
 
      10-07-2005
On 10/6/05, m4dc4p <> wrote:
> I should have explained the format_result proc a little. Google's
> responses have spaces (using '<font size=3D-2> </font>') instead of
> commas, so that is the first replacement. The second two deal with
> scientific notation. Try entering a query like "400 lightyears * 10
> parsecs" and you will see the characters its trying to replace.


For what it's worth, it's probably better to look at reimplementing
this using the Google WS API, because Google looks down (harshly) on
screen scraping.

-austin
--
Austin Ziegler *
* Alternate:


 
Reply With Quote
 
James Britt
Guest
Posts: n/a
 
      10-07-2005
Austin Ziegler wrote:
>
> For what it's worth, it's probably better to look at reimplementing
> this using the Google WS API, because Google looks down (harshly) on
> screen scraping.


Is that what this is?

I believe Google is concerned with the extraction and reuse of search
data to drive (part of) another site or application. I see the Google
Calculator app to be an implementation of a Web browser: Make an HTTP
request, get back the text, and render it.


James





 
Reply With Quote
 
Devin Mullins
Guest
Posts: n/a
 
      10-07-2005
Hi,

m4dc4p wrote:

>format_result = Proc.new { |s|
> s.gsub("<font size=-2>
></font>",",").gsub("×","x").gsub("<sup>","^").gsub(" </sup>", "")
>}
>
>

Why not just def format_result(s) ... end?

D3v1n



 
Reply With Quote
 
m4dc4p
Guest
Posts: n/a
 
      10-07-2005
I thought I had tried that but obviously I did something wrong. Thanks
for the suggestion - its a little clearer now.

 
Reply With Quote
 
m4dc4p
Guest
Posts: n/a
 
      10-07-2005
The needs for this script are so lightweight, it just didn't seem worth
it to go through the pain of figuring out how to call Google's WS API.
I did look into it, and if it had allowed me to make calculator
specific queries I would have used it. Unfortunately, it does not. I'm
not sure what results it would return for this kind of query but it
seemed a lot simpler just to extract the results from their results
page.

 
Reply With Quote
 
Phil Tomson
Guest
Posts: n/a
 
      10-07-2005
In article < .com>,
m4dc4p <> wrote:
>I whipped a quick script to send queries to Google and scrape results
>if it's a valid "calculator" query. If you don't know what I mean, put
>"5 + 5" into the Google search box. I love the feature but hate having
>to open a web browser each time I want to use it. Thus, this script!


Google is now a calculator?! Uh, errr, umm, this is getting a little bit out
of hand, no?

You could also use irb as a calculator:
irb(main):009:0> 5+5
=> 10

>
>I'm pretty much a n00b to Ruby so any feedback, improvements, comments
>are appreciated. Enjoy!
>
>--- cut here ---
>require 'net/http'
>require 'cgi'
>
>format_result = Proc.new { |s|
> s.gsub("<font size=-2>
></font>",",").gsub("×","x").gsub("<sup>","^").gsub(" </sup>", "")
>}
>
>matchExp = Regexp.new("<td><img
>src=/images/calc_img.gif></td><td>&nbsp;</td><td nowrap>(.*?) =
>(.*?)</b>")
>while ((! (print "Enter an expression (exit to quit): "; line =
>gets).nil?) && line.strip.upcase != "EXIT")
> resp =
>Net::HTTP.get_response(URI.parse("http://www.google.com/search?q=#{CGI.escape(line.strip)}"))
> if resp.code == "200"
> begin
> matches = matchExp.match(resp.body)
> puts "==>" + format_result.call(matches[2])
> rescue NoMethodError
> puts "==> Expression not understood."
> rescue
> puts "==> Expression not understood. (#{$!.class.inspect},
>#{$!.inspect})"
> end
> else
> puts "==> Response error: #{resp.code}"
> end
>end
>


Well, that's, uh, cool, but there's gotta be easier ways to add numbers

Phil
 
Reply With Quote
 
Phil Tomson
Guest
Posts: n/a
 
      10-07-2005
In article < .com>,
m4dc4p <> wrote:
>I whipped a quick script to send queries to Google and scrape results
>if it's a valid "calculator" query. If you don't know what I mean, put
>"5 + 5" into the Google search box. I love the feature but hate having
>to open a web browser each time I want to use it. Thus, this script!
>
>I'm pretty much a n00b to Ruby so any feedback, improvements, comments
>are appreciated. Enjoy!
>
>--- cut here ---
>require 'net/http'
>require 'cgi'
>
>format_result = Proc.new { |s|
> s.gsub("<font size=-2>
></font>",",").gsub("×","x").gsub("<sup>","^").gsub(" </sup>", "")
>}
>
>matchExp = Regexp.new("<td><img
>src=/images/calc_img.gif></td><td>&nbsp;</td><td nowrap>(.*?) =
>(.*?)</b>")
>while ((! (print "Enter an expression (exit to quit): "; line =
>gets).nil?) && line.strip.upcase != "EXIT")
> resp =
>Net::HTTP.get_response(URI.parse("http://www.google.com/search?q=#{CGI.escape(line.strip)}"))
> if resp.code == "200"
> begin
> matches = matchExp.match(resp.body)
> puts "==>" + format_result.call(matches[2])
> rescue NoMethodError
> puts "==> Expression not understood."
> rescue
> puts "==> Expression not understood. (#{$!.class.inspect},
>#{$!.inspect})"
> end
> else
> puts "==> Response error: #{resp.code}"
> end
>end
>


Sorry for two replies to the same post, but I tried your code and I always
get Expression not understood:

Enter an expression (exit to quit): 20 + 20
==> Expression not understood.

Oh, and as a former boss of mine used to say often: "Rube Goldberg would be
proud" (of this very convoluted method for adding numbers.

Phil
 
Reply With Quote
 
Wilson Bilkovich
Guest
Posts: n/a
 
      10-07-2005
Actually, it's a little cooler than anything built into IRB. For example:
http://www.google.com/search?hl=3Den...btnG=3DGoogle=
+Search

or:
http://www.google.com/search?hl=3Den...D1&q=3D15+pou=
nd+feet+in+newton+meters&btnG=3DSearch

On 10/7/05, Phil Tomson <> wrote:
> In article < .com>,
> m4dc4p <> wrote:
> >I whipped a quick script to send queries to Google and scrape results
> >if it's a valid "calculator" query. If you don't know what I mean, put
> >"5 + 5" into the Google search box. I love the feature but hate having
> >to open a web browser each time I want to use it. Thus, this script!

>
> Google is now a calculator?! Uh, errr, umm, this is getting a little bit =

out
> of hand, no?
>
> You could also use irb as a calculator:
> irb(main):009:0> 5+5
> =3D> 10
>
> >
> >I'm pretty much a n00b to Ruby so any feedback, improvements, comments
> >are appreciated. Enjoy!
> >
> >--- cut here ---
> >require 'net/http'
> >require 'cgi'
> >
> >format_result =3D Proc.new { |s|
> > s.gsub("<font size=3D-2>
> ></font>",",").gsub("×","x").gsub("<sup>","^").gsub(" </sup>", "")
> >}
> >
> >matchExp =3D Regexp.new("<td><img
> >src=3D/images/calc_img.gif></td><td>&nbsp;</td><td nowrap>(.*?) =3D
> >(.*?)</b>")
> >while ((! (print "Enter an expression (exit to quit): "; line =3D
> >gets).nil?) && line.strip.upcase !=3D "EXIT")
> > resp =3D
> >Net::HTTP.get_response(URI.parse("http://www.google.com/search?q=3D#{CGI=

escape(line.strip)}"))
> > if resp.code =3D=3D "200"
> > begin
> > matches =3D matchExp.match(resp.body)
> > puts "=3D=3D>" + format_result.call(matches[2])
> > rescue NoMethodError
> > puts "=3D=3D> Expression not understood."
> > rescue
> > puts "=3D=3D> Expression not understood. (#{$!.class.inspect},
> >#{$!.inspect})"
> > end
> > else
> > puts "=3D=3D> Response error: #{resp.code}"
> > end
> >end
> >

>
> Well, that's, uh, cool, but there's gotta be easier ways to add numbers ;=

-)
>
> Phil
>
>



 
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
Running command line tool from web application =?Utf-8?B?TWFuZHk=?= ASP .Net 10 01-17-2005 04:53 PM
1-line calculator *spool Don McDonald NZ Computing 0 06-30-2004 03:54 AM
command line tool for comparing XML files Corno XML 8 02-22-2004 10:49 AM
Technical google.calculator.BMI Body Mass Index. Don McDonald NZ Computing 0 02-07-2004 03:21 AM
JPEG Command line tool ? Sideshow Mel Digital Photography 6 12-16-2003 08:56 PM



Advertisments