I have this Wikipedia category page: https://fr.wikipedia.org/wiki/Catégorie:Pièce_de_théâtre_du_XVIIIe_siècle
I'd like to open the page of each play listed (e.g. https://fr.wikipedia.org/wiki/L'Oiseau_vert) and print the first sentence of it (e.g. L'Oiseau vert (L'augellino belverde) est une comédie de Carlo Gozzi (auteur italien de pièces de théâtre) parue en 1765). A dataframe with the play title in the 1st column and the first sentence in the 2nd one would also be good.
I tried to get all the page links through BeautifulSoup
and print the first sentences with wikipedia.summary()
but results are not satisfactory, since the wikipedia
module often redirects to the wrong articles. Part of the problem may be caused by the French special characters within the play titles (é, â, etc.)
Is there a better method to access the individual articles directly from the category page?
This question seems related but hasn't helped me further.
CodePudding user response:
There is a better method to access the individual articles directly from the category page: Wikipedia API!
You can try this:
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']
In case of 'Les Acteurs de bonne foi' the summary returns:
'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.\nMarivaux fit jouer les Acteurs de bonne foi au Théâtre-Français en 1755, mais la pièce ne réussit pas. Elle fut publiée pour la première fois dans le Conservateur de novembre 1757. L’intérêt de la pièce repose principalement sur un jeu qu’entretient Marivaux avec son lecteur grâce à la mise en abyme. En effet, le texte mêle au sein d’une même page : entretien des acteurs sur leurs vies respectives, dialogues sur les possibilités de jeu et de mise en scène ainsi que répliques d’un texte qui est alors joué. Dans cette pièce, qui est la dernière que l’auteur ait fait jouer sur un grand théâtre, où la scène de comédie est rapidement détournée et donne lieu à une confusion entre la situation réelle et la scène jouée, la mise en abyme révèle l’importance de l’illusion théâtrale.'
CodePudding user response:
Here's an example how you can achieve that using beautifulsoup
only:
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égorie:Pièce_de_théâtre_du_XVIIIe_siècle"
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()
The code is self-explanatory:
- First we find
div
s that havecategory-group
class, extract alla
elements and gettitle
andhref
- Then for each
category
i.e. piece we parse HTML and get the firstp
in thediv
withmw-parser-output
class (That should be the first sentence).
Note: I added
clean_categories
sincecategory-group
picked up unwanted things that hadCatégorie
in them.
Example of output for first couple of pieces:
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'honneur
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)
And Result:
{"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.'}