Извлечь конкретную строку из результата curl'd - PullRequest
3 голосов
/ 13 июня 2010

Учитывая эту команду curl: curl --user-agent "fogent" --silent -o page.html "http://www.google.com/search?q=insansiate"

* Правописание намеренно неверно. Я хочу взять предложение как мой результат.

Я хочу иметь возможность либо войти в файл page.html, возможно, с помощью grep -oE, либо передать его прямо из curl и никогда не сохранять файл.

Результат должен быть: 'instantiate'

Мне нужно только слово 'instantiate', или фраза, независимо от того, что google автоматически исправляет, это то, что я ищу.

Вот основной html, который возвращается:

<span class=spell style="color:#cc0000">Did you mean: </span><a href="/search?hl=en&amp;ie=UTF-8&amp;&amp;sa=X&amp;ei=VEMUTMDqGoOINraK3NwL&amp;ved=0CB0QBSgA&amp;q=instantiate&amp;spell=1"class=spell><b><i>instantiate</i></b></a>&nbsp;&nbsp;<span class=std>Top 2 results shown</span>

Так что, возможно, от / до приведенной ниже строки, которая, я надеюсь, достаточно уникальна, чтобы охватить все мои базы.

class=spell><b><i>instantiate</i></b></a>&nbsp;&nbsp;

У меня постоянно возникают проблемы с жадным grep; возможно, я должен запустить его через инструмент предварительного преобразования HTML, чтобы получить разрыв строки или 50 там. Я не знаю ни одного простого способа сделать это в bash, и я бы хотел, чтобы это было в идеале. Я действительно не хочу иметь дело с запуском Perl и проверкой наличия правильного модуля.

Есть предложения, спасибо?

Ответы [ 4 ]

4 голосов
/ 13 июня 2010

Как я уверен, вы в курсе, что очистка экрана - дело деликатное.Эта последовательность команд не является исключением, поскольку она зависит от конкретной структуры страницы, которая может измениться в любое время без уведомления.

grep -o 'Did you mean:\([^>]*>\)\{5\}' page.html | sed 's/.*<i>\([^<]*\)<.*/\1/' page.html

В конвейере:

curl --user-agent "fogent" --silent "http://www.google.com/search?q=insansiate" | grep -o 'Did you mean:\([^>]*>\)\{5\}' page.html | sed 's/.*<i>\([^<]*\)<.*/\1/'

Это зависитнайти пять символов «>» между «Вы имели в виду:» и «</i>» после слова, которое вы ищете.

Рассматривали ли вы другие способы получения орфографических предложений или вас особенно интересуетчто предоставляет Google?

Если у вас установлен ispell или aspell, вы можете сделать:

echo insansiate | ispell -a

и проанализировать результат.

2 голосов
/ 25 ноября 2013

xidel - отличная утилита для очистки веб-страниц; поддерживает поиск страниц и извлечение информации на разных языках запросов (селекторы CSS, XPath).

В данном случае простой селектор CSS a.spell сделает свое дело.

xidel --user-agent "fogent" "http://google.com/search?q=insansiate" -e 'a.spell'

Обратите внимание, как xidel выполняет поиск собственной страницы, поэтому в этом случае curl не требуется.

Если, однако, вам нужен curl для более экзотических вариантов поиска, вот как вы можете объединить два инструмента (разрыв строки для удобства чтения):

curl --user-agent "fogent" --silent "http://google.com/search?q=insansiate" |
xidel - -e 'a.spell'
0 голосов
/ 13 июня 2010

Редактировать: Извините, не видел вашего уведомления Perl.

#! / Usr / bin / perl use strict;использовать LWP :: UserAgent;

my $arg = shift // 'insansiate';

my $lwp = LWP::UserAgent->new(agent => 'Mozilla');
my $c = $lwp->get("http://www.google.com/search?q=$arg") or die $!;

my @content = split(/:/, $c->content);

for(@content) {
  if(m;<b><i>(.+)</i></b>;) {
    print "$1\n";
    exit;
    }
}

Запуск:

 > perl google.pl 
    instantiate
 > perl google.pl disconect
    disconnect
0 голосов
/ 13 июня 2010

curl -> tidy -asxml -> xmlstarlet sel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...