Code Golf: анализ результатов Google

16

Когда вы что-то ищете в Google, на странице результатов пользователь может видеть зеленые ссылки для первой страницы результатов.

В кратчайшей форме, в байтах, используя любой язык, отобразите эти ссылки на стандартный вывод в виде списка. Вот пример для первых результатов запроса на обмен стека:

Снимок экрана

Вход:

Вы выбираете: URL ( www.google.com/search?q=stackexchange&ie=utf-8&oe=utf-8) или простоstackexchange

Выход :

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

Правила:

  • Вы можете использовать сокращатели URL или другие инструменты поиска / API, если результаты будут такими же, как при поиске на https://www.google.com .

  • Это нормально, если у вашей программы есть побочные эффекты, такие как открытие веб-браузера, поэтому загадочные html / js-страницы Google можно читать по мере их отображения.

  • Вы можете использовать плагины браузера, пользовательские скрипты ...

  • Если вы не можете использовать стандартный вывод, выведите его на экран, например, с помощью. всплывающее окно или предупреждение JavaScript!

  • Вам не нужно окончание / или начальный http (s): //

  • Вы не должны показывать любую другую ссылку

  • Самый короткий код выигрывает!

  • Удачи !

РЕДАКТИРОВАТЬ: Этот гольф заканчивается 07/08/15.

WayToDoor
источник
Так как вы используете google.fr, мы должны использовать это также?
бета-распад
Вы можете использовать любой Google, который вы хотите. Я француз, поэтому я использовал .fr, но вы могли бы использовать .com или .anything :) Не имеет значения
WayToDoor
И сокращенные URL, такие gogle.deкак хорошо?
бета-распад
Вы можете использовать сокращатели URL или другие инструменты поиска / API, если результаты будут такими же, как и при поиске на google.com , так что да
WayToDoor
6
Если вы испытываете искушение: помните, что вы не можете анализировать HTML с помощью регулярных выражений
Луис Мендо,

Ответы:

17

Баш + Греп + Рысь, 38

Так как мы можем открыть веб-браузер, я буду использовать lynx:

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

(Спасибо @manatwork за grepиспользование вместо sed)

Мы передаем весь URL в качестве параметра:

$ ./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
$ 

Что дает тот же список, что и:

введите описание изображения здесь

Цифровая травма
источник
Ну, это удобно: D
бета-распад
3
sedхорошо. sedдлинная. Попробуйте GNU grep:grep -Po '(?<=d:)[^&]+'
manatwork
@manatwork Да, конечно - спасибо!
Цифровая травма
1
Был ли текст ответа скопирован? ;) Ни один из bash, lynxили sed(и сейчас grep) не является частью coreutils.
Манатворк
3
Я полагаю, что вы также можете сделать: lynx -dump $1|grep -Po 'd:\K[^&]+'(не проверено)
Jarmex
4

Рубин, 91 77 байт

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

Был бы короче без всех requireс. ARGH !!! РЕДАКТИРОВАТЬ : Итак, оказывается, мне не нужно второе требование! Спасибо @manatwork за указание на это.

Старая версия (с бесполезной require):

require'open-uri';require 'uri';open(gets).read.scan(/ed:(.*?)\+/){|x|puts URI.decode x[0]}
kirbyfan64sos
источник
Правила позволяют использовать параметры командной строки, если вы их тоже учитываете: pastebin.com/PnpjnXji (Если вы считаете, что это несправедливый стиль, не стесняйтесь использовать только изменения в блоке кода.)
manatwork
Вы уверены, что вам нужно явно require'uri'? В 2.1.2 я использую URIмодуль становится доступным после запроса open-uri.
manatwork
@manatwork Спасибо! Обновлено.
kirbyfan64sos
Просто для любопытства: есть ли причина не менять блок кода, как в моей альтернативе pastebin? (Конечно, мне любопытны технические причины, а не личные причины, если это вас сдерживает.)
manatwork
@ Manatwork мне нужно, но я был слишком ленив, чтобы выяснить количество байтов в данный момент. :)
kirbyfan64sos
4

Wolfram Language (Mathematica), 135

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

более читабельно:

StringJoin/@(Cases[
    URLExecute["www.google.com/search",{"q"->#},"XMLObject"], 
    XMLElement["cite",_,l_]:>l,-1] /. 
    XMLElement["b",_,{s_}]:>s)
Чу ý
источник
Пространства действительно необходимы? Без них я получаю 136 байтов .
kirbyfan64sos
совсем не обязательно ... Я действительно должен это ужесточить ..
Чу
Можете ли вы сделать что-то вроде этого ответа, чтобы сократить это?
Цифровая травма
3

Python 3, 141 байт

Нигде недалеко от ответа Digital Trauma, но было забавно выработать регулярное выражение: 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))))

Для ввода http://www.google.com/search?q=stackexchange&ie=utf-8&oe=utf-8выходных данных программы:

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/

Реализует совет GRC

Бета распад
источник
Вы действительно должны использовать __import__?
ckjbgames
Кроме того, используйте [x for x in spam]конструкцию вместо map. Это сэкономит вам большое количество байтов.
ckjbgames
2

Фактор, 31 байт

Для этого есть библиотека.

[ google-search [ url>> ] map ]
Кот
источник