Вот что я пытаюсь сделать:

  1. Скачать веб-страницу
  2. Найти все строки, соответствующие регулярному выражению в нем
  3. Добавляйте и добавляйте к ним строковые константы, чтобы сформировать полностью определенные URL-адреса.
  4. Скачать их все

Это должно быть легко! Достаточно связки curl и grep нанизанных на трубы, но я не могу этого сделать!

curl http://example.com/?q=blah | grep -o -P "(?<=alt=\")[^\"]*\"" | what's next?

Кроме того, grep, похоже, не распознает [^\"] .

Такие вещи, как DownThemAll! не достаточно гибки.

3 ответа3

1

Я отказался от grep. Надеюсь, решение Perl в порядке.

curl http://example.com/?q=blah | perl -e '@ alt = map {/alt = "(.*?)"/ig}; вывести" $ _\n "foreach (@alt)'

учитывая этот вход:

afk alt="<I want to find this>" easdfg alt="<I want to find that>" 
adsfsgw wt er ger 
ekfj er  alt="<I want to find this other>" alt="<I want to find this anotherthing>" fgerg
ey 
 ty rth
<img src="file.gif">

это возвращает это:

<I want to find this>
<I want to find that>
<I want to find this other>
<I want to find this anotherthing>
0

wget -r -A.pdf [url] для простых шаблонов. Это будет загружать все PDF с [URL] рекурсивно. Этот фрагмент из документа полезен.

'-A acclist --accept acclist' '-R rejlist --reject rejlist' Указать разделенные запятыми списки суффиксов или шаблонов имен файлов, которые следует принимать или отклонять (см. Типы файлов). Обратите внимание, что если в элементе acclist или rejlist появится какой-либо из подстановочных знаков '*', '?', '[' Или ']', он будет рассматриваться как шаблон, а не как суффикс.

0

Я заметил, что двойные кавычки используются повсеместно, поэтому я думаю, что это делается в cmd.exe (хотя многие пользователи Linux используют grep, есть версия для Windows. Я приветствую любые исправления для меня по этому поводу, но ваш пример выглядит так, как будто он относится к реализации Windows, благодаря использованию двойных кавычек. Я тоже использую реализацию Windows grep - Gnuwin32. (в отличие от Cygwin, например).

Прежде всего, я хотел бы исправить ошибку в строке, которую вы использовали с помощью grep(я не буду называть это ошибкой в вашем регулярном выражении, так как это проблема cmd.

Вот ваш пример с регулярным выражением grep, которое не работает.

curl http://example.com/?q=blah | grep -o -P "(?<=alt=\")[^\"]*\"" | what's next?

Как вы говорите, [^\"] не работает

Давайте посмотрим, что именно передается в grep с помощью cmd (что анализирует grep)

Для этого потребуется программа на C, программа C включена в этот вопрос о неработающей кавычке Получение этого простого регулярного выражения для сопоставления в grep

Я вставлю код программы на C здесь.

Вы можете использовать эту программу, чтобы увидеть, что получает grep или любая другая программа Windows. (Я могу ошибаться по некоторым техническим причинам здесь, и я приветствую исправление, если это так). Тем не менее, это работает.

Вот программа, которую мы будем использовать, чтобы определить, что происходит

#include <stdio.h>

int main(int argc, char *argv[]) {
    int i = 0;
    while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
    }
    return 0;
}

Я скомпилировал это. wc, to w.exe

Вот простой пример того, что происходит ..

Вот пример, который работает

W:\>w "[^\"]"
argv[0] = w
argv[1] = [^"]

W:\>

Вы видите выше, что наша программа (w) получает 2 параметра, первый - имя программы (w), второй - [^"]

Теперь вот пример намного меньшего размера, у которого тот же сбой, что и у вас, [^\"] не работает

W:\>w "\"[^\"]"
argv[0] = w
argv[1] = "["]

W:\>

Посмотрите, что получает grep. Я не знаю почему .. Но похоже, что когда это \"стоит перед [^ \"] и вокруг него есть двойные кавычки, тогда [^ \"] не работает, мы видим именно результат, приходит [^ \"] как ["] Мы теряем свою карету ^

Это сохранит нашу карету, как мы видим в программе.

W:\>w "\"[^^\"]"
argv[0] = w
argv[1] = "[^"]

W:\>

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

В качестве примера

W:\>echo blah alt="test" | grep -o -P "(?<=alt=\")[^^\"]*(?=\")"
test

Предположим, у нас есть этот файл с именем аа

dsfsdf dfdsf  alt="here" dddd

rrtrtdfddalt="there"dfdfd
alt="df"
tree="dop"

Теперь мы применяем

W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df

W:\>

Итак, регулярное выражение работает и в grep.

W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df

W:\>

Теперь давайте предположим, что я могу вывести это в файл. AB так AB теперь содержит эти 3 строки. (вы всегда можете скопировать / вставить его в ab)

Теперь Аб имеет

here
there
df

давайте использовать sed, чтобы добавить немного до и после

W:\>sed -r "s#(.*)#http://blah.com/\1.htm#" a.b
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm
W:\>

И мы могли бы скачать все эти с Wget

W:\>sed -r "s#(.*)#http://blah.com/\1.htm#" a.b >a.c

W:\>type a.c
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm

W:\>wget -i a.c
--2012-07-26 23:21:06--  http://blah.com/here.htm
Resolving blah.com... ^C
W:\>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .