我有這個維基百科分類頁面:https : //fr.wikipedia.org/wiki/Catégorie : Pièce_de_théâtre_du_XVIIIe_siècle
我想打開列出的每個劇本的頁面(例如https://fr.wikipedia.org/wiki/L'Oiseau_vert)并列印它的第一句話(例如L'Oiseau vert (L'augellino belverde) est une comédie de Carlo Gozzi (auteur italien de pièces de théatre) parue en 1765 )。第一列中的播放標題和第二列中的第一句話的資料框也很好。
我試圖通過所有頁面鏈接BeautifulSoup并列印第一句話,wikipedia.summary()但結果并不令人滿意,因為該wikipedia模塊經常重定向到錯誤的文章。部分問題可能是由劇名中的法語特殊字符(é、a 等)引起的
有沒有更好的方法可以直接從類別頁面訪問各個文章?
這個問題似乎相關,但沒有進一步幫助我。
uj5u.com熱心網友回復:
有一種更好的方法可以直接從類別頁面訪問各個文章:維基百科 API!
你可以試試這個:
import requests
url = "https://fr.wikipedia.org/w/api.php"
params = {
"action": "query",
"cmtitle": "Catégorie:Pièce de théatre 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”的情況下,摘要回傳:
'Les Acteurs de bonne foi est une comédie en unacte et en prose de Marivaux, jouée pour la première fois chez Quinault cadette le 30 oc??tobre 1748.\nMarivaux fit jouer les Acteurs de bonnea foi au Thraisèté 5 ne réussit pas. Elle fut publiée pour la première fois dans le Conservateur de 1757 年 11 月。En effet, le texte mêle au sein d'une meme page : entretien des acteurs sur leurs vies vies各自,對話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éatre,
uj5u.com熱心網友回復:
這是一個如何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é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()
代碼是不言自明的:
- 首先我們找到
div具有category-group類的s ,提取所有a元素并獲取title和href - 然后,每
category即一塊我們決議HTML并獲得第一個p在div同mw-parser-output等級(這應該是第一句)。
注意:我添加了
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'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)
結果:
{"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éatre '
"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éatre 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.'}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/377787.html
