web-dev-qa-db-fra.com

Comment puis-je obtenir le texte d'un article Wikipedia en utilisant Python 3 avec Beautiful Soup?

J'ai ce script fait en Python 3:

response = simple_get("https://en.wikipedia.org/wiki/Mathematics")
result = {}
result["url"] = url
if response is not None:
    html = BeautifulSoup(response, 'html.parser')
    title = html.select("#firstHeading")[0].text

Comme vous pouvez le voir, je peux obtenir le titre de l'article, mais je ne sais pas comment obtenir le texte de "Mathématiques (du grec μά ..." à la table des matières ...

17
user10798111

sélectionnez le <p> tag. Il y a 52 éléments. Je ne sais pas si vous voulez le tout, mais vous pouvez parcourir ces balises pour le stocker comme vous le pouvez. J'ai simplement choisi d'imprimer chacun d'eux pour afficher la sortie.

import bs4
import requests


response = requests.get("https://en.wikipedia.org/wiki/Mathematics")

if response is not None:
    html = bs4.BeautifulSoup(response.text, 'html.parser')

    title = html.select("#firstHeading")[0].text
    paragraphs = html.select("p")
    for para in paragraphs:
        print (para.text)

    # just grab the text up to contents as stated in question
    intro = '\n'.join([ para.text for para in paragraphs[0:5]])
    print (intro)
15
chitown88

Il existe un moyen beaucoup plus simple d'obtenir des informations de wikipedia - API Wikipedia .

Il y a this Python wrapper , qui vous permet de le faire en quelques lignes uniquement avec zéro analyse HTML:

import wikipediaapi

wiki_wiki = wikipediaapi.Wikipedia('en')

page = wiki_wiki.page('Mathematics')
print(page.summary)

Tirages:

Les mathématiques (du grec μάθημα máthēma, "connaissance, étude, apprentissage") comprennent l'étude de sujets tels que la quantité, la structure, l'espace et le changement ... (omis intentionnellement)

Et, en général, essayez d'éviter le grattage d'écran si une API directe est disponible.

31
alecxe

Utilisez la bibliothèque wikipedia

import wikipedia
#print(wikipedia.summary("Mathematics"))
#wikipedia.search("Mathematics")
print(wikipedia.page("Mathematics").content)
15
QHarr

Vous pouvez obtenir la sortie souhaitée en utilisant la bibliothèque lxml comme ci-dessous.

import requests
from lxml.html import fromstring

url = "https://en.wikipedia.org/wiki/Mathematics"

res = requests.get(url)
source = fromstring(res.content)
paragraph = '\n'.join([item.text_content() for item in source.xpath('//p[following::h2[2][span="History"]]')])
print(paragraph)

Utilisation de BeautifulSoup:

from bs4 import BeautifulSoup
import requests

res = requests.get("https://en.wikipedia.org/wiki/Mathematics")
soup = BeautifulSoup(res.text, 'html.parser')
for item in soup.find_all("p"):
    if item.text.startswith("The history"):break
    print(item.text)
5
SIM

Ce que vous semblez vouloir, c'est le contenu de la page (HTML) sans les éléments de navigation environnants. Comme je l'ai décrit dans cette réponse antérieure de 201 , il y a (au moins) deux façons de l'obtenir:

L'avantage de l'utilisation de l'API est qu'elle peut également vous donner beaucoup ( d'autres informations sur la page que vous pouvez trouver utile. Par exemple, si vous souhaitez avoir une liste des liens interlangues normalement affichés dans la barre latérale de la page, ou les catégories normalement affichées sous la zone de contenu, vous pouvez obtenir ceux de l'API comme ceci:

https://en.wikipedia.org/w/api.php?format=xml&action=parse&page=Mathematics&prop=langlinks|categories

(Pour obtenir également le contenu de la page avec la même demande, utilisez prop=langlinks|categories|text.)

Il existe plusieurs bibliothèques Python pour l'utilisation de l'API MediaWiki qui peuvent automatiser certains détails de son utilisation, bien que l'ensemble de fonctionnalités qu'elles prennent en charge puisse varier. Cela dit, il est également parfaitement possible d'utiliser l'API directement à partir de votre code sans bibliothèque entre les deux.

2
Ilmari Karonen

Pour obtenir une manière appropriée d'utiliser la fonction, vous pouvez simplement obtenir l'API JSON offerte par Wikipedia:

from urllib.request import urlopen
from urllib.parse import urlencode
from json import loads


def getJSON(page):
    params = urlencode({
        'format': 'json',
        'action': 'parse',
        'prop': 'text',
        'redirects' : 'true',
        'page': page})
    API = "https://en.wikipedia.org/w/api.php"
    response = urlopen(API + "?" + params)
    return response.read().decode('utf-8')


def getRawPage(page):
    parsed = loads(getJSON(page))
    try:
        title = parsed['parse']['title']
        content = parsed['parse']['text']['*']
        return title, content
    except KeyError:
        # The page doesn't exist
        return None, None

title, content = getRawPage("Mathematics")

enter image description here

Vous pouvez ensuite l'analyser avec n'importe quelle bibliothèque dont vous voulez extraire ce dont vous avez besoin :)

2
LaSul