实施 Wiki:"API:Get the contents of a page" 在 Python

Implement Wiki: "API:Get the contents of a page" in Python

我正在学习使用 Wiki API 获取用户的 public 信息。我在 MediaWiki-API-demos 中找到了脚本 "get_users.py",它可以帮助我们获取一般信息,例如编辑次数或电子邮件地址。但是,用户页面上的个人描述无法通过这种方式获取。

(例子如下。我想获取文本信息,如“我通常不活跃在英文维基百科上。请参考...”)

我发现 "API: Get the contents of a page" 提供了实现该目标的选项。因为我对PHP一窍不通,请问有什么办法可以利用Python中的API得到这些文本吗?

非常感谢您提前抽出时间!

更新

我正在尝试搜索如下用户列表的用户信息: 如果我想搜索他们的个人陈述,有没有什么办法可以一次执行,而不是一个一个循环然后输入到脚本中? (它来自演示:get_pages_revisions.py

(假设我们要查找Catrope和Bob的信息,下面修改PARAMS的实现不能正常工作:

PARAMS = {
    "action": "query",
    "prop": "revisions",
    "titles": "User:Catrope|Bob",
    "rvprop": "timestamp|user|comment|content",
    "rvslots": "main",
    "formatversion": "2",
    "format": "json"
}

)

您无需了解 PHP 即可使用来自 API: Get the contents of a page 的信息。只有 URL 扩展名为 .php - 仅此而已 - 您可以将这些 URL 与任何语言一起使用 - 即。 python。即使 get_users.py 中的代码也使用 URL 和扩展名 .php 并且它不使用 PHP 代码。

您只需添加 &format=json 即可获取数据 JSON 而不是 HTML

我不知道你需要哪个 URL 获取数据,但你可以将其用作字符串

import requests

r = requests.get("https://en.wikipedia.org/w/api.php?action=parse&page=Pet_door&prop=text&formatversion=2&format=json")

data = r.json()

print(data['parse']['text'])

或者你可以把参数写成字典——就像在get_users.py中那样——这样对用户来说更易读,也更容易改变参数

import requests

params = {
    'action': 'parse',
#    'page': 'Pet_door',
    'page': 'USER:Catrope',
#    'prop': 'text',
    'prop': 'wikitext',   
    'formatversion': 2,
    'format': 'json'
}

r = requests.get("https://en.wikipedia.org/w/api.php", params=params)
data = r.json()

#print(data.keys())
#print(data)
#print('---')

#print(data['parse'].keys())
#print(data['parse'])
#print('---')

#print(data['parse']['text'])    # if you use param `'prop': 'text'
#print('---')

print(data['parse']['wikitext']) # if you use param `'prop': 'wikitext'
print('---')

# print all not empty lines
for line in data['parse']['wikitext'].split('\n'):
    line = line.strip()  # remove spaces
    if line: # skip empty lines
        print('--- line ---')
        print(line)

print('---')

# get first line of text (with "I'm not usually active on English Wikipedia. Please refer...")
print(data['parse']['wikitext'].split('\n')[0]) 

因为'prop': 'text'它returnsHTML那么它需要lxmlBeautifulSoup才能在HTML中搜索信息。对于 'prop': 'wikitext' 它给出没有 HTML 标签的文本并且使用 split('\n')[0] 更容易获得带有

的第一行
I'm not usually active on English Wikipedia. Please refer to my [[mw:User:Catrope|user page]] at [[mw:|MediaWiki.org]].

编辑: 它没有在一个请求中获取所有页面的方法。你必须使用 for-loop with 'page': 'USER:{}'.format(name)

import requests

for name in ['Catrope', 'Barek']:
    print('name:', name)

    params = {
        'action': 'parse',

        'page': 'USER:{}'.format(name),  # create page name

    #    'prop': 'text',
        'prop': 'wikitext',   
        'formatversion': 2,
        'format': 'json'
    }

    r = requests.get("https://en.wikipedia.org/w/api.php", params=params)
    data = r.json()

    #print(data['parse']['text'])
    print(data['parse']['wikitext'])
    print('---')

编辑: 对于 query revisions 你必须使用完整的标题

 "titles": "User:Catrope|User:Bob|User:Barek",

但不是标题给出结果所以你必须检查数据

中是否有revisions
import requests

S = requests.Session()

URL = "https://www.mediawiki.org/w/api.php"

PARAMS = {
    "action": "query",
    "prop": "revisions",
    "titles": "User:Catrope|User:Bob|User:Barek",
    "rvprop": "timestamp|user|comment|content",
    "rvslots": "main",
    "formatversion": "2",
    "format": "json"
}

R = S.get(url=URL, params=PARAMS)
DATA = R.json()

PAGES = DATA["query"]["pages"]

for page in PAGES:
    if "revisions" in page:
        for rev in page["revisions"]:
            print(rev['slots']['main']['content'])
    else:
        print(page)