Python抓取维基百科类别页面



我有这个维基百科分类页面: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类的divs,提取所有a元素,得到titlehref
  • 然后,对于每个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.'}

最新更新