是否可以通过电影类别从Wikipedia API获取信息?例如,我搜索头像的网址,但我不知道如何搜索头像电影。
https://en.wikipedia.org/w/api.php?&titles=avatar&format=xml&action=query&prop=extracts|categories|categoryinfo|pageterms|pageprops|pageimages&exintro=&explaintext=&cllimit=max&piprop=original
答案 0 :(得分:2)
“电影类别”并不容易,因为有很多嵌套类别,但你可以使用别的东西 - 所有关于电影的文章都包含在自己Template:Infobox film内,我们可以通过MediaWiki API获取所有这些内容:
https://en.wikipedia.org/w/api.php?format=xml&action=query&list=embeddedin&einamespace=0&eilimit=500&eititle=Template:Infobox_film
然后,您决定如何搜索它们 - 通过正则表达式,Contains()
或StartsWith()
,CaseInsensitive
或不会,将返回首次找到或所有匹配等...
以下是C#中所有标题以“阿凡达”开头的电影文章的例子:
var articles = GetMovies("Avatar");
...
private static List<string> GetMovies(string word)
{
var api = "https://en.wikipedia.org/w/api.php?format=xml&action=query&list=embeddedin&" +
"einamespace=0&eilimit=500&eititle=Template:Infobox film";
var articles = new List<string>();
var next = string.Empty;
while (true)
{
using (var response = (HttpWebResponse)WebRequest.Create(api + next).GetResponse())
{
using (var reader = new StreamReader(response.GetResponseStream()))
{
var xElement = XElement.Parse(reader.ReadToEnd());
articles.AddRange(xElement.Descendants("ei")
.Select(x => x.Attribute("title").Value)
.Where(x => Regex.IsMatch(x, "^" + word + "\\b")));
var cont = xElement.Element("continue");
if (cont == null) break;
next = "&eicontinue=" + cont.Attribute("eicontinue").Value;
}
}
}
return articles;
}
这将返回:
Avatar (2009 film)
Avatar (2004 film)
Avatar (1916 film)