Code Golf: Analisando resultados do google


16

Quando você pesquisa algo no google, na página de resultados, o usuário pode ver links verdes para a primeira página de resultados.

Na forma mais curta possível, em bytes, usando qualquer idioma, exiba esses links para stdout na forma de uma lista. Aqui está um exemplo, para os primeiros resultados da consulta de troca de pilhas:

Uma captura de tela

Entrada :

você escolhe: o URL ( www.google.com/search?q=stackexchange&ie=utf-8&oe=utf-8) ou apenasstackexchange

Resultado :

french.stackexchange.com/, stackoverflow.com/, fr.wikipedia.org/wiki/Stack_Exchange_Network, en.wikipedia.org/wiki/Stack_Exchange,...

Regras :

  • Você pode usar encurtadores de URL ou outras ferramentas / APIs de pesquisa, desde que os resultados sejam os mesmos da pesquisa em https://www.google.com .

  • Tudo bem se o seu programa tiver efeitos colaterais, como abrir um navegador da Web, para que as páginas criptografadas html / js do Google possam ser lidas à medida que são renderizadas.

  • Você pode usar plugins de navegador, scripts de usuários ...

  • Se você não pode usar o stdout, imprima-o na tela com, por exemplo. um alerta pop-up ou javascript!

  • Você não precisa do final / ou do (s) http (s) inicial: //

  • Você não deve mostrar nenhum outro link

  • O menor código vence!

  • Boa sorte !

EDIT: Este golfe termina em 07/08/15.


Desde que você está usando google.fr, temos que usá-lo também?
Beta Decay

Você pode usar qualquer google que quiser. Eu sou francês, então eu usei .fr, mas você poderia usar .com ou .anything :) dos não importa
WayToDoor

E URLs encurtados, como também gogle.desão bons?
Beta Decay

Você pode usar Redutores de URL ou outras ferramentas de pesquisa / APIs, desde que os resultados seriam os mesmos que busca google.com , então sim
WayToDoor

6
No caso você está tentado: lembre-se que você não pode analisar HTML com regex
Luis Mendo

Respostas:


17

Bash + grep + lince, 38

Como podemos abrir um navegador da Web, usarei lynx:

lynx -dump $1|grep -Po '(?<=d:)[^&]+'

(Obrigado a @manatwork pelo grepuso em vez de sed)

Passamos todo o URL como parâmetro:

$ ./gr.sh "www.google.com/search?q=stackexchange&ie=utf-8&oe=utf-8"
http://stackexchange.com/
https://en.wikipedia.org/wiki/Stack_Exchange
https://twitter.com/stackexchange
https://play.google.com/store/apps/details?id=com.stackexchange.marvin
https://github.com/StackExchange/StackExchange.Redis
https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Basics.md
https://www.crunchbase.com/organization/stack-exchange
$ 

Que fornece a mesma lista que:

insira a descrição da imagem aqui


Bem, isso é útil: D
Beta Decay

3
sedBoa. sedgrandes. Tente GNU grep:grep -Po '(?<=d:)[^&]+'
manatwork

@manatwork Sim, claro - obrigado!
Digital Trauma

11
O título da resposta foi copypasted? ;) Nenhum de bash, lynxou sed(e agora grep) faz parte dos coreutils.
manatwork

3
Eu acredito que você também pode fazer: lynx -dump $1|grep -Po 'd:\K[^&]+'(não testado)
Jarmex

4

Ruby, 91 77 bytes

require'open-uri';open(gets).read.scan(/ed:(.*?)\+/){|x|puts URI.decode x[0]}

Teria sido mais curto sem todos os requires. ARGH !!! Edição : Então, ao que parece , eu não preciso do segundo exigir! Obrigado a @manatwork por apontar isso.

Versão mais antiga (com o inútil require):

require'open-uri';require 'uri';open(gets).read.scan(/ed:(.*?)\+/){|x|puts URI.decode x[0]}

Regras permitem o uso de opções de linha de comando enquanto você contá-los também: pastebin.com/PnpjnXji (Se você sentir este é o estilo injusto, sinta-se livre para usar apenas a mudança no bloco de código.)
manatwork

Tem certeza de que precisa explicitamente require'uri'? No 2.1.2 eu uso o URImódulo fica disponível depois de exigir o open-uri.
manatwork 31/07

@manatwork Obrigado! Atualizada.
Kirbyfan64sos

Apenas para minha curiosidade: alguma razão para não alterar o bloco de código como na minha alternativa pastebin? (Claro, eu sou curioso sobre razões técnicas, não motivos pessoais, se isso impedi-lo.)
manatwork

@ manatwork eu preciso, mas eu estava com preguiça de descobrir a contagem de bytes no momento. :)
kirbyfan64sos

4

Língua Wolfram (Mathematica), 135

StringJoin/@(Cases[URLExecute["www.google.com/search",{"q"->#},"XMLObject"],XMLElement["cite",_,l_]:>l,-1]/.XMLElement["b",_,{s_}]:>s)&

mais legível:

StringJoin/@(Cases[
    URLExecute["www.google.com/search",{"q"->#},"XMLObject"], 
    XMLElement["cite",_,l_]:>l,-1] /. 
    XMLElement["b",_,{s_}]:>s)

Os espaços são realmente necessários? Sem eles, recebo 136 bytes .
Kirbyfan64sos

não é necessário ... eu realmente deveria apertar isso .. #
308

Você pode fazer algo como esta resposta para encurtar isso?
Digital Trauma

3

Python 3, 141 bytes

Em nenhum lugar perto da resposta do Digital Trauma, mas foi divertido descobrir a regex: D

import re
print('\n'.join(map(lambda x:x[3:],re.findall('te>http[s]?://\w+\.[a-z]+[](/a-z\.)?]+',__import__("requests").get(input()).text))))

Para entrada, http://www.google.com/search?q=stackexchange&ie=utf-8&oe=utf-8as saídas do programa:

https://en.wikipedia.org/wiki/
https://twitter.com/
https://play.google.com/store/apps/details?id...
https://www.crunchbase.com/organization/
https://www.facebook.com/
https://github.com/

Implementa a dica de grc


Você realmente precisa usar __import__?
Ckjbgames

Além disso, use uma [x for x in spam]construção em vez de map. Isso economizará um bom número de bytes.
Ckjbgames

2

Fator, 31 bytes

Acontece que existe uma biblioteca para isso.

[ google-search [ url>> ] map ]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.