我有这个维基百科分类页面:https://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Pi%C3%A8ce_de_th%C3%A9%C3%A2tre_du_XVIIIe_si%C3%A8cle
我想打开列出的每个剧本的页面(例如。https://fr.wikipedia.org/wiki/L%27Oiseau_vert)并打印它的第一句话(例如L'Oiseau vert(L'augelino belverde(是Carlo Gozzi(意大利导演(1765年的作品(。第一列中有剧本标题,第二列中有第一句话的数据帧也很好。
我试图通过BeautifulSoup
获取所有页面链接,并用wikipedia.summary()
打印第一句,但结果并不令人满意,因为wikipedia
模块经常重定向到错误的文章。部分问题可能是由戏剧标题中的法国特殊角色(é、â等(引起的
有没有更好的方法可以直接从类别页面访问个别文章?
这个问题似乎有关联,但对我没有进一步的帮助。
有一种更好的方法可以直接从分类页面访问单个文章:维基百科API!
你可以试试这个:
import requests
url = "https://fr.wikipedia.org/w/api.php"
params = {
"action": "query",
"cmtitle": "Catégorie:Pièce de théâtre du XVIIIe siècle",
"cmlimit": "50",
"list": "categorymembers",
"format": "json"
}
req = requests.get(url=url, params=params)
pages = req.json()['query']['categorymembers']
# here just iterate over category individual pages
for page in pages:
# eg. page = {'pageid': 622757, 'ns': 0, 'title': 'Les Acteurs de bonne foi'}
_url = 'https://fr.wikipedia.org/w/api.php'
_params = {
'format': 'json',
'action': 'query',
'prop': 'extracts',
'exintro': True,
'explaintext': True,
'redirects': 1,
'pageids': page['pageid'],
}
req = requests.get(_url, _params)
summary = req.json()['query']['pages'][str(page['pageid'])]['extract']
在"Les Acteurs de bonne foi"的情况下,摘要返回:
《波恩的演员》是一部关于表演和散文的喜剧Marivaux,30岁的Quinault学员1748年10月1755年的法国剧院(Théâtre Français(。Elle fut1757年11月,《音乐学院院长》出版。《安息日原则》Marivaux的儿子是一位名叫grâceàla mise en abyme的讲师。实际上,文本我的主页:舞台上的演员们尊重,关于未来和未来可能性的对话这是一个很好的例子。在其他方面,这是一位在大剧院的导演,这是一个快速的比赛和比赛混乱的局势和今天的情况《歌剧院幻觉的重要性》
以下是如何仅使用beautifulsoup
实现这一点的示例:
import requests
from bs4 import BeautifulSoup
def get_categories(data):
print("Getting categories...")
categories = {}
soup = BeautifulSoup(data, "lxml")
group_divs = soup.find_all("div", {"class": "mw-category-group"})
for div in group_divs:
links = div.find_all("a")
for link in links:
title = link.get("title")
href = link.get("href")
categories[title] = "https://fr.wikipedia.org" + href
print(f"Found Categories: {len(categories)}")
return categories
def get_first_paragraph(data):
soup = BeautifulSoup(data, "lxml")
parser_output = soup.find("div", {"class": "mw-parser-output"})
first_paragraph = parser_output.find("p", {"class": None}, recursive=False)
return first_paragraph.text
def process_categories(categories):
result = {}
for title, link in categories.items():
print(f"Processing Piece: {title}, on link: {link}")
data = requests.get(link).content
first_paragraph = get_first_paragraph(data)
result[title] = first_paragraph.strip()
return result
def clean_categories(categories):
return {k: v for k, v in categories.items() if "Catégorie" not in k}
def main():
categories_url = "https://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Pi%C3%A8ce_de_th%C3%A9%C3%A2tre_du_XVIIIe_si%C3%A8cle"
data_categories = requests.get(categories_url).content
categories = get_categories(data_categories)
categories = clean_categories(categories)
result = process_categories(categories)
print(result) # create dataframe etc...
if __name__ == "__main__":
main()
代码不言自明:
- 首先我们找到具有
category-group
类的div
s,提取所有a
元素,得到title
和href
- 然后,对于每个
category
,即片段,我们解析HTML,并用mw-parser-output
类获得div
中的第一个p
(这应该是第一句话(
注意:我添加了
clean_categories
,因为category-group
拾取了包含Catégorie
的不需要的东西。
第一对工件的输出示例:
Getting categories...
Found Categories: 198
Processing Piece: Les Acteurs de bonne foi, on link: https://fr.wikipedia.org/wiki/Les_Acteurs_de_bonne_foi
Processing Piece: Adamire ou la Statue de l'honneur, on link: https://fr.wikipedia.org/wiki/Adamire_ou_la_Statue_de_l%27honneur
Processing Piece: Agamemnon (Lemercier), on link: https://fr.wikipedia.org/wiki/Agamemnon_(Lemercier)
Processing Piece: Agathocle (Voltaire), on link: https://fr.wikipedia.org/wiki/Agathocle_(Voltaire)
结果:
{"Adamire ou la Statue de l'honneur": "Adamire ou la Statue de l'honneur est "
'la traduction par Thomas-Simon '
'Gueullette de la pièce de théâtre '
"italienne l'Adamira overo la Statua "
"dell'Honore de Giacinto Andrea "
'Cicognini représentée pour la première '
'fois en France le 12 décembre 1717 à '
"Paris, à l'Hôtel de Bourgogne.",
'Agamemnon (Lemercier)': 'Agamemnon est une tragédie en cinq actes considérée '
"comme le chef-d'œuvre dramatique de Népomucène "
'Lemercier. Elle fut représentée au Théâtre de la '
'République le 5 floréal an V (24 avril 1797) et '
'valut à son auteur une célébrité immédiate.',
'Agathocle (Voltaire)': 'Agathocle est une tragédie écrite par Voltaire, '
'représentée pour la première fois le 31 mai 1779, '
'sur la scène de la Comédie-Française.',
'Les Acteurs de bonne foi': 'Les Acteurs de bonne foi est une comédie en un '
'acte et en prose de Marivaux, jouée pour la '
'première fois chez Quinault cadette le 30 '
'octobre 1748.'}