实施 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
那么它需要lxml
或BeautifulSoup
才能在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)
我正在学习使用 Wiki API 获取用户的 public 信息。我在 MediaWiki-API-demos 中找到了脚本 "get_users.py",它可以帮助我们获取一般信息,例如编辑次数或电子邮件地址。但是,用户页面上的个人描述无法通过这种方式获取。
(例子如下。我想获取文本信息,如“我通常不活跃在英文维基百科上。请参考...”)
我发现 "API: Get the contents of a page" 提供了实现该目标的选项。因为我对PHP一窍不通,请问有什么办法可以利用Python中的API得到这些文本吗?
非常感谢您提前抽出时间!
更新:
我正在尝试搜索如下用户列表的用户信息:
(假设我们要查找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
那么它需要lxml
或BeautifulSoup
才能在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)