在Python中实现Wiki:“API:获取页面内容”

2024-10-03 21:30:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习使用Wiki API获取用户的公共信息。我在MediaWiki API演示中找到了脚本"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"
}

)


Tags: 用户py脚本api信息编辑getwiki
1条回答
网友
1楼 · 发布于 2024-10-03 21:30:37

您不必了解PHP就可以使用来自API: Get the contents of a page的信息。只有扩展名为.php的URL—仅此而已—您可以将这些URL与任何语言(例如python)一起使用。即使是get_users.py中的代码也使用扩展名为.php的URL,并且它不为此使用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'返回HTML,所以需要lxmlBeautifulSoupHTML中搜索信息。对于'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与'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{}您必须使用完整的标题

 "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)

相关问题 更多 >