0

我想在 bash 中按 curl 顺序在同一页面上提交两个表单。http://en.wikipedia.org/w/index.php?title=Special:Export包含两种形式:一种用于填充给定 Wikipedia 类别的页面列表,另一种用于获取该列表的 XML 数据。

在 bash 中使用 curl,我可以独立提交第一个表单,返回一个填充 pages 字段的 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。

4

2 回答 2

1

Special:Export并不意味着全自动检索。API是。例如,要以 XML 格式获取Category:Works by Leonardo da Vinci中所有页面的当前文本,您可以使用以下 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 个页面(尽管在这种情况下这不是问题,并且有一种访问其余页面的方法)。

于 2011-10-09T00:09:09.530 回答
0

假设您可以解析第一个 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
于 2011-10-09T00:09:04.320 回答