- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有什么方法可以得到一个类别中所有维基百科文章的列表,包括所有子类别?
我尝试使用 PHP 脚本从类别页面中提取链接,但似乎无法获取所有文章,包括子类别。
最佳答案
您可以使用 MediaWiki API 执行此操作, 具体来说 list=categorymembers
.
这是一个随机的例子:
上面的链接将为您提供 Category:Defunct airports in Prince Edward Island 中所有页面的列表。采用 XML 格式(默认情况下打印精美以便于人类阅读)。您可以选择各种机器可读的 output formats通过将适当的参数(例如 format=xml
或 format=json
)附加到 URL。
请注意,一般来说,上面显示的查询将包括类别中的所有 页面,包括文章和子类别。您可以通过包含参数 cmnamespace=0
将其限制为仅包含文章,但这样您将错过任何子类别。 (不过,您始终可以使用 cmnamespace=14
单独获取它们。)
您可能需要该信息的原因是 list=categorymembers
查询本身不会递归到子类别中,因此如果您需要,则必须自己做。不过,如果您这样做,请注意不要陷入任何类别循环,并确保对结果进行健全性检查 — 很容易方式从完整的子类别遍历。
此外,默认情况下,单个 categorymembers
查询最多会给您 10 个结果。您可以通过在查询中包含参数 cmlimit=max
将该限制增加到 500(或 5000,如果您碰巧可以访问维基百科上的 bot-flagged account),但即便如此,类别仍然非常大可能会被切断。如果发生这种情况,查询结果将包含 query continuation。部分将告诉您(或您的 MW API client library )如何使用其他查询获取其余页面。
编辑:我有点想念您专门询问有关获取子类别文章的事实。这是一些基本的(未经测试的!)示例代码,说明如何使用 Apibot 0.40 执行此操作桥接口(interface)(我只是随机选择的,因为它看起来像一个不错的 PHP MW API 客户端库,所以我不需要担心查询延续等细节):
function pages_under_category ( $category ) {
global $bridge; // I'll assume you've set this up in advance
$queue = array( $category ); // categories to fetch
$seen = array( $category ); // categories already seen
$pages = array(); // result pages (format: $title => array( $cat, ... ))
while ( !empty( $queue ) ) {
$cat = array_shift( $queue );
$query = $bridge->query_list_categorymembers();
$query->title = $cat; // assume "Category:" prefix is included
// fetch the contents of the category
$query_result = $query->xfer();
while ( $query_result ) {
foreach ( $query->data as $page_data ) {
$title = $page_data['title'];
$namespace = $page_data['ns'];
if ( $namespace == 0 ) { // it's an article!
if ( !isset( $pages[$title] ) ) {
$pages[$title] = array();
}
$pages[$title][] = $cat; // record where we found it
}
else if ( $namespace == 14 ) { // it's a subcategory
if ( !in_array( $title, $seen ) ) {
$seen[] = $title; // avoid loops!
$queue[] = $title;
}
}
}
$query_result = $query->next();
}
}
return $pages;
}
您可能想要添加到上述代码中的一个功能是对结果大小/迭代次数的某种限制,这样即使递归检索以某种方式找到了它的方式,比如说,Category:Contents。 , 它会在某个时候停止尝试列出维基百科上的每一页。
关于php - 列出一个类别和子类别中的所有维基百科文章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21497323/
好吧,我看过一些帖子提到其他一些关于不使用 SP wiki 的帖子,因为它们很糟糕。 既然我们正在考虑在 SP 中创建 wiki,我需要知道为什么我们不应该让 6 名自动化开发人员来记录各种自动化流程
在 GitLab Wiki 部分,可以查看保存更改的历史记录。但是,当您单击提交链接时,它将显示该保存中存在的整个文件。有谁知道一种方法来区分提交以仅获取两个提交之间的差异? 这类似于它在 merge
我使用了 Wiki API 文档中的一些示例代码,但是当我输入搜索项时,没有任何反应。控制台中没有错误,什么也没有。如果我将 URL 输入到浏览器中,URL 本身就会起作用,所以我认为代码中的某些内容
我想在我的 wiki 中创建一个层次结构,如下所示: General FooPages Foo1 Foo2 Foo3 ODP Bar Baz 我想创建这些页
我正在尝试使用为 Python 制作的 Wikimapia 的 pymapia API,但无法理解如何正确使用它。 import pymapia as PyMapia a = PyMapia.PyMa
我正在开发适用于 iOS 的客户端应用程序,用于在 Mac OS X 服务器(Snow Leopard 和 Lion)上编辑内置的 Wiki/Blog。 看来我们可以使用 MetaWeblog 、At
我正在编写一些 URL 重写软件,我想从多个角度了解哪种 URL 方案更可取: 博客风格:my-chemistry-answer -- 为什么? -- (不可取,技术性) Wiki 风格:My_Che
我一直试图找到一种方法来在 Azure DevOps Wiki 中创建子页面的目录。我从其他 wiki 服务中找到了方法。 在 Confluence 中,他们有一个用于“ child 显示”的宏 我为
我是一名优秀的程序员,十分优秀!