bash / curl: двухэтапная отправка веб-формы - PullRequest
0 голосов
/ 09 октября 2011

Я хочу отправить две формы на одной странице в последовательности с curl в bash. http://en.wikipedia.org/w/index.php?title=Special:Export содержит две формы: одну для заполнения списка страниц с учетом категории в Википедии, а другую для извлечения данных XML для этого списка.

Используя curl в bash, я могу отправить первую форму независимо, вернув html-файл с заполненным полем страниц (хотя я не могу его использовать, поскольку он локальный, а не на сервере википедии):

curl -d "addcat=1&catname=Works_by_Leonardo_da_Vinci&curonly=1&action=submit" http://en.wikipedia.org/w/index.php?title=Special:Export -o "somefile.html"

И я могу отправить вторую форму при указании страницы, чтобы получить XML:

curl -d "pages=Mona_Lisa&curonly=1&action=submit" http://en.wikipedia.org/w/index.php?title=Special:Export -o "output.xml"

... но я не могу понять, как объединить два шага или передать один шаг в другой, чтобы вернуть XML для всех страниц в категории, как я получаю, когда выполняю два шага вручную. http://www.mediawiki.org/wiki/Manual:Parameters_to_Special:Export, кажется, предполагает, что это возможно; есть идеи? Мне не нужно использовать curl или bash.

Ответы [ 2 ]

1 голос
/ 09 октября 2011

Special:Export не предназначен для полностью автоматического поиска. API есть.Например, чтобы получить текущий текст всех страниц в Категория: Работы Леонардо да Винчи в формате XML, можно использовать этот URL:

http://en.wikipedia.org/w/api.php?format=xml&action=query&generator=categorymembers&gcmtitle=Category:Works_by_Leonardo_da_Vinci&prop=revisions&rvprop=content&gcmlimit=max

Это не возвращает страницы в подкатегориях и ограничивается только первыми 500 страницами (хотя в данном случае это не проблема, и есть доступ к остальным).

0 голосов
/ 09 октября 2011

Предполагая, что вы можете проанализировать вывод из первого html-файла и сгенерировать список страниц (например,

Mona Lisa
The Last Supper

Вы можете передать вывод в цикл bash, используя read. В качестве простого примера:

$ seq 1 5 | while read x; do echo "I read $x"; done
I read 1
I read 2
I read 3
I read 4
I read 5
...