Google I’m Feeling Lucky: fazer uma requisição para http://www.google.com.br, pesquisando pelo nome da linguagem(java,ruby,…). Exibir como retorno o endereço, título e descrição do primeiro resultado encontrado.
Ruby (meu):
require 'open-uri'
open('http://www.google.com.br/search?q=ruby').read =~ %r{class=l href="(.*?)">(.*?)</a.*?j><font.*?>(.*?)<br><}m
puts ($2 + "\n" + $1 + "\n" + $3 + "\n").gsub(/<.*?\>/, '')
Java (do Giuliano, bastante melhorada depois pelo Urubatan):
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;
public class HTTPSample {
public static void main(String[] args) throws Exception {
URLConnection con = new URL("http://www.google.com/search?q=java").openConnection();
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
Scanner sc = new Scanner(con.getInputStream());
System.out.println(sc.findWithinHorizon("<a>.*?</a>", 0).replaceAll("<a>(.*?)</a>", "$2=$1").replaceAll("", ""));
}
}
PHP (do Pilger, com ajuste do Fernando):
<?php
$html = implode('', file('http://www.google.com.br/search?q=php'));
preg_match_all("|class=l href=\"(.*?)\">(.*?)</a.*?j><font.*?>(.*?)<br><|", $html, $out, PREG_SET_ORDER);
echo $out[0][1]." ".$out[0][2]." ".$out[0][3];
?>
Python (do Salviato):
import urllib
import re
class AppURLopener(urllib.FancyURLopener):
version = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1"
urllib._urlopener = AppURLopener()
html = urllib.urlopen('http://www.google.com.br/search?q=python').read()
out = re.search('class=l href="(.*?)">(.*?)</a.*?j><font.*?>(.*?)<br><', html, re.DOTALL)
print re.sub('<.*?>', '', (out.group(1) + '\n' + out.group(2) + '\n' + out.group(3)))
TCl/TK (do Salviato):
package require http
http::config -useragent {Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1}
set html [http::data [http::geturl {http://www.google.com.br/search?q=tcl}]]
set out [regexp -inline {class=l href="(.*?)">(.*?)(.*?)< } $html]
puts [regsub -all {<.*?>} [concat "[lindex $out 1]\n[lindex $out 2]\n[lindex $out 3]"] "" ]
VB (do Giuliano):
Dim http As New WinHttp.WinHttpRequest
Dim re As New RegExp, matcher As Match
Dim texto As String
http.Open "GET", "http://www.google.com.br/search?q=java", False
http.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7"
http.Send
texto = http.ResponseText
re.Pattern = "class=l href=""(.*?)"">(.*?)</a.*?j><font.*?>(.*?)<br><"
re.Global = True
re.IgnoreCase = True
re.MultiLine = True
For Each matcher In re.Execute(texto)
Dim strSaida: strSaida = ""
strSaida = matcher.SubMatches(0) + vbCrLf + matcher.SubMatches(1) + vbCrLf + matcher.SubMatches(2)
MsgBox strSaida
Exit For
Next
Coldfusion (do Kenji)
<cfhttp url="http://www.google.com.br/search?q=coldfusion+mx">
<cfset tmp = REFindNoCase('class=l href="(.*?)">(.*?)</a.*?j><font.*?>(.*?)<br><', cfhttp.filecontent,1,true)>
<cfoutput>#mid(cfhttp.filecontent,tmp.pos[2],tmp.len[2])# #mid(cfhttp.filecontent,tmp.pos[3],tmp.len[3])# #mid(cfhttp.filecontent,tmp.pos[4],tmp.len[4])#</cfoutput>
Popularity: 33% [?]
16 Responses to Code contest #1
Nullability » Code contest
March 30th, 2006 at 8:13 pm
[...] Aceitei a intimação do Diego e topei o primeiro desafio usando Groovy. O código segue abaixo: [code lang=”Java”] def content = new URL(”http://www.google.com.br/search?q=groovy”).getText(); def text = (content =~/class=l href=”(.*?)”>(.*?)< /a.*?j>(.*?) [...]
Tiago
March 31st, 2006 at 10:37 am
É incrível como cada vez eu tenho mais desgosto em ver código Java para coisas triviais do dia-a-dia… earkk
Leonardo Goslar Otto
March 31st, 2006 at 2:07 pm
Nossa to curtindo muito estes context.
Quero ver quando o pessoal começar a postar Lisp e outras linguagens.
Continuem o context, e que venham varias linguagens.
Paranbéns pela iniciativa.
Urubatan
March 31st, 2006 at 6:09 pm
o código java pode ser beem menor do que este postado a cima, da uma olhada nisto aqui.
PS.: concordo que java não é uma linguagem apropriada para processamento de textos assim, e a linha do header é por que o google não gosta de java, ele da um 403, se não colocar aquilo, para evitar consultas automatizadas.
import java.net.URL; import java.net.URLConnection; import java.util.Scanner; public class HTTPSample { public static void main(String[] args) throws Exception { URLConnection con = new URL("http://www.google.com/search?q=java").openConnection(); con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7"); Scanner sc = new Scanner(con.getInputStream()); System.out.println(sc.findWithinHorizon(".*?", 0).replaceAll("(.*?)", "$2=$1").replaceAll("", "")); } }Giuliano
March 31st, 2006 at 7:32 pm
Urubatan,
na verdade aquele header tem que ser setado porque o google bloqueia requisições que não tenham sido feitas por um browser para evitar leitura da sua página de resultados por programas de terceiros! Claro que tem sempre como burlar…hehehe…
Agora só não me perguntem porque com Groovy, Ruby e PHP, não são necessárias.
Hoje fiz um em VB que também necessitou desse header.
Falou…
Pedro
April 2nd, 2006 at 10:43 am
Diego, vou dar uma de velho, mas estou percebendo que existe uma pequena “sacanagem” neste contest, ehhe.
Afinal, o que é “ganhar” o contest? É escrever código mais curto? Mais LEET? Estes critérios na minha opinião não são adequados.
Afinal, o maior desafio nosso é manter código, não escrever. Escrever é fácil. Então dois critérios me parecem um alerta sobre a qualidade deste tipo de solução:
* A menos que você seja o pai das regexps, é muito difícil ler estas soluções. Expressão regular longa e com 3 matches não é algo para bater o olho e compreender.
* Se amanhã o Google mudar o HTML, como vamos dar manutenção neste tipo de solução? A correção vai envolver entender algo relativamente complicado – e reescrever algo igualmente complicado.
Como diria o jwz: “Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems”.
hehe, é isso, apenas uma nota. Não que eu tenha uma solução melhor, e ainda assim todas demonstram muita “bad 0wnage”.
Giuliano
April 2nd, 2006 at 4:35 pm
JavaScript
var str = document.body.innerHTML; var reg = /class=l href="(.*?)">(.*?)(.*?)/gi; var m = reg.exec(str); if(m) { var saida = "Titulo: " + m[1] + "\n"; saida += "Link: " + m[2].replace(c, "") + "\n"; saida += "Descrição: " + m[3].replace(c, "") + "\n"; alert(saida); }Thingol
April 5th, 2006 at 2:52 pm
Expressões regulares? Use a Google API. Não há nada mágico aqui.
[code]
import com.google.soap.search.*;
class ImFeelingLucky {
public static void main(String[] args) {
String clientKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // substitua por sua chave Google API
GoogleSearch gs = new GoogleSearch();
gs.setKey (clientKey);
gs.setMaxResults(1);
gs.setQueryString ("java");
GoogleSearchResult gsr = null;
try {
gsr = gs.doSearch();
GoogleSearchResultElement[] gsre = gsr.getResultElements();
for (int i = 0; i
Diego Pires Plentz
April 5th, 2006 at 10:30 pm
Pedro,
Respondendo às suas perguntas.
Na verdade nem existe ganhador, é somente um comparativo de códigos mesmo.
Acredito que sem usar regexp’s nenhum desses códigos ficaria mais legível. Independente do programador conhecer ou não regexp’s.
Sem dúvida.
Há controversias
Mas legais as observações. Abraço
Rafael
April 6th, 2006 at 11:53 am
hhuumm, queria conhecer o Pedro, gostei do comentário dele.
Ta bom ta bom, eu sei que to devendo uma versão .NET pra ti..
Não reclama..
Abraço.
Nullability » Rapidinhas
April 6th, 2006 at 9:55 pm
[...] Conversas com o Guillaume Laforge sobre alterações no Groovy SDK para o bem da humanidade (tudo por causa do Diego). [...]
Nullability » Code Contest - 2
April 7th, 2006 at 4:14 pm
[...] A primeira parte pode ser encontrada aqui. O desafio desta semana é simples. Imagine que você tem um mecanismo de backup beeeeeeeeeem barato, isto é, você tem pouco espaço para armazenamento. Portanto, você quer remover do seu backup todos os arquivos de um determinado diretório (algo como /tmp/backup) que sejam mais velhos do que 1 semana. Como você faria isso usando sua linguagem favorita? [...]
Thiago Bohn » Blog Archive » Dynamic Language Runtime
May 3rd, 2007 at 9:53 am
[...] faz mais de ano que o Diego Pires Plentz meu falou sobre as inovações do Ruby on Rails, na época eu era um programador Delphi fazendo uns “bicos” com C#. No dia chegamos a [...]
Rodrigo Urubatan
July 13th, 2007 at 4:24 pm
Minha vez de lançar um code contest pra galera
http://www.urubatan.com.br/2007/07/13/code-contest-valendo-uma-cortesia-para-o-just-java-2007/
Valendo uma entrada de grátis pro Just Java
No ruby parece tudo fácil, até screen scrapping … (E não estou falando do rails agora) | Blog do Urubatan
August 19th, 2007 at 9:46 pm
[...] de um Code Contest no blog do Diego Plentz a algum tempo, a idéia era mostrar a forma mais fácil em cada linguagem [...]
strongest weight loss and fat burner pill
September 24th, 2008 at 2:54 am
strongest weight loss and fat burner pill…
ruthless slights Mackinac cleanliness?carbolic!…